初来乍道,问个比较菜的问题:如何把一文件中指定的内容提取出来? VCL组件开发及应用http://www.delphi2007.net/DelphiVCL/html/delphi_20061223005343172.html
数据内容如下:
72800.000 38.91898908 -77.06621526 40.7516 1112188.776 -4842946.894 3985349.437 6.3756030408e-007 0.82 4.48 8 8 0.00000 0 0 0.000
172830.000 38.91898135 -77.06620653 41.6280 1112189.787 -4842947.914 3985349.320 6.4061365069e-007 1.05 4.51 8 8 0.00833 0 0 30.000
172860.000 38.91895879 -77.06620348 47.2173 1112191.370 -4842953.626 3985350.883 6.5588341696e-007 1.45 4.09 9 9 0.01667 0 1 0.000
172890.000 38.91895839 -77.06620595 47.4124 1112191.202 -4842953.850 3985350.971 6.5682624245e-007 1.46 4.11 9 9 0.02500 0 1 30.000
172920.000 38.91896101 -77.06620285 47.2516 1112191.395 -4842953.489 3985351.097 6.5675199614e-007 1.42 4.12 9 9 0.03333 0 2 0.000
172950.000 38.91896486 -77.06620350 46.7696 1112191.196 -4842952.875 3985351.126 6.5579189199e-007 1.32 4.14 9 9 0.04167 0 2 30.000
172980.000 38.91896559 -77.06620199 46.4309 1112191.253 -4842952.539 3985350.977 6.5487505133e-007 1.28 4.15 9 9 0.05000 0 3 0.000
173010.000 38.91896711 -77.06620177 45.8964 1112191.155 -4842952.026 3985350.772 6.5348139453e-007 1.25 4.17 9 9 0.05833 0 3 30.000
173040.000 38.91896774 -77.06619940 45.3632 1112191.252 -4842951.533 3985350.492 6.5210196616e-007 1.19 4.18 9 9 0.06667 0 4 0.000
173070.000 38.91896760 -77.06619931 45.6531 1112191.313 -4842951.761 3985350.662 6.5307188787e-007 1.23 4.19 9 9 0.07500 0 4 30.000
173100.000 38.91896831 -77.06619921 45.5575 1112191.294 -4842951.638 3985350.663 6.5291762658e-007 1.17 4.21 9 9 0.08333 0 5 0.000
用什么方法可以把每一行的第一个值那个用科学计数法表示的值给提取出来,最好能给出源码,谢谢了!
用TStringList
可以很方便的取出每行数据
var
list1 :TStringList
begin
list1 ;=TStringList.create;
list1.loadFrom(filename);
...
然后再取 第一个值
TStringList
但怎么取值呢,能说的详细吗,谢谢。
你可以单行提取,然后用 ' '做结束标志,单个提取啊
StrToFloat 能够识别科学计数法。
我刚接触DELPHI不太清楚,看帮助里没有写关于Tstringlist有提取一行中某个数据是方法,
weixiaohua(我爱Delphi) 你说用''作结束标志,怎么操作呢,能写段代码最好,可以学习一下。
function GetValidStr3 (Str: string; var Dest: string; const Divider: array of Char): string;
const
BUF_SIZE = 20480; //$7FFF;
var
Buf: array[0..BUF_SIZE] of char;
BufCount, Count, SrcLen, I, ArrCount: Longint;
Ch: char;
label
CATCH_DIV;
begin
Ch:=#0;//Jacky
try
SrcLen := Length(Str);
BufCount := 0;
Count := 1;
if SrcLen >= BUF_SIZE-1 then begin
Result := '';
Dest := '';
exit;
end;
if Str = '' then begin
Dest := '';
Result := Str;
exit;
end;
ArrCount := sizeof(Divider) div sizeof(char);
while TRUE do begin
if Count <= SrcLen then begin
Ch := Str[Count];
for I:=0 to ArrCount- 1 do
if Ch = Divider[I] then
goto CATCH_DIV;
end;
if (Count > SrcLen) then begin
CATCH_DIV:
if (BufCount > 0) then begin
if BufCount < BUF_SIZE-1 then begin
Buf[BufCount] := #0;
Dest := string (Buf);
Result := Copy (Str, Count+1, SrcLen-Count);
end;
break;
end else begin
if (Count > SrcLen) then begin
Dest := '';
Result := Copy (Str, Count+2, SrcLen-1);
break;
end;
end;
end else begin
if BufCount < BUF_SIZE-1 then begin
Buf[BufCount] := Ch;
Inc (BufCount);
end;// else
//ShowMessage ('BUF_SIZE overflow !');
end;
Inc (Count);
end;
except
Dest := '';
Result := '';
end;
end;
上面这个函数功能就是你需要的.使用方法如下
tStr := GetValidStr3(tStr, s18, [' ', #9]);
tStr := GetValidStr3(tStr, s1C, [' ', #9]);
tStr := GetValidStr3(tStr, s20, [' ', #9]);
提取出来在转换成数就行了.
weixiaohua(我爱Delphi) 谢谢你的回复,但这个函数对于初期的我来说有点难度,看不明白,不知有没有相对简单一点的方法,要是没有我就放分结贴了,。
第一次来这里就看到这么多热心的人,很感谢大家,也感谢CSDN。。
你不用管那个函数的具体实现.
假如你的数据在DataList中.
DataList := TStringList.Create;
DataList.LoadFromFile('X:\XX.txt');
for I := DataList.count - 1 do
begin
sLine := DataList.Strings[I];
sLine := GetValidStr3(sLine, str1, [' ', #9]); //假如第一行 str1 := 72800.000;
//sLine := GetValidStr3(sLine, str1, [' ', #9]); //在执行一次 str1 := 38.91898908 你可以依此类推.
StrToFloat(str1); //转换后就是你需要的数了.
end;
up
weixiaohua(我爱Delphi) 谢谢了,分已送出请查收。。