文本文件每行如下格式:
2003年12月02日00时00分 16.251 0.0000 14.088 ...现在要把它处理后分成多个字段写入到数据库中,我的处理方式有两种:
1
var
f:textfile;
line:string;
ts:TStringList;
begin
if not OpenDialog1.Execute then Exit;
AssignFile(f,OpenDialog1.FileName);
Reset(f); while not eof(f) do
begin
readln(f,line);
//AA是结束标志,后面还有其它信息
if trim(line)='AA' then Exit;
ts:=TstringList.Create;
//字符串处理
ExtractStrings([' '],[],Pchar(line),ts);
... //其它语句
ts.Free;
end;
end;2
var
f:textfile;
line:string;
i,j:integer;
ts:TStringList;;
begin
if not OpenDialog1.Execute then Exit;
AssignFile(f,OpenDialog1.FileName);
Reset(f); while not eof(f) do
begin
readln(f,line);
if trim(line)='AA' then Exit;
//字符串处理
ts:=TstringList.Create;
line:=trim(line);
while Pos(' ',line)<>0 do
begin
i:=Pos(' ',line);
ts.Add(Copy(line,1,i-1));
delete(line,1,i);
line:=trim(line);
end;
ts.Add(line); ... //其它语句
ts.Free;
end;
end;如果文本有很多的话,执行一个文件的速度很慢,字符串处理的方法不一样,但是我看ExtractStrings函数的处理好象比我这个还要复杂,总之两个都慢,是不是文件的读取方式有问题,还望高手指点。
2003年12月02日00时00分 16.251 0.0000 14.088 ...现在要把它处理后分成多个字段写入到数据库中,我的处理方式有两种:
1
var
f:textfile;
line:string;
ts:TStringList;
begin
if not OpenDialog1.Execute then Exit;
AssignFile(f,OpenDialog1.FileName);
Reset(f); while not eof(f) do
begin
readln(f,line);
//AA是结束标志,后面还有其它信息
if trim(line)='AA' then Exit;
ts:=TstringList.Create;
//字符串处理
ExtractStrings([' '],[],Pchar(line),ts);
... //其它语句
ts.Free;
end;
end;2
var
f:textfile;
line:string;
i,j:integer;
ts:TStringList;;
begin
if not OpenDialog1.Execute then Exit;
AssignFile(f,OpenDialog1.FileName);
Reset(f); while not eof(f) do
begin
readln(f,line);
if trim(line)='AA' then Exit;
//字符串处理
ts:=TstringList.Create;
line:=trim(line);
while Pos(' ',line)<>0 do
begin
i:=Pos(' ',line);
ts.Add(Copy(line,1,i-1));
delete(line,1,i);
line:=trim(line);
end;
ts.Add(line); ... //其它语句
ts.Free;
end;
end;如果文本有很多的话,执行一个文件的速度很慢,字符串处理的方法不一样,但是我看ExtractStrings函数的处理好象比我这个还要复杂,总之两个都慢,是不是文件的读取方式有问题,还望高手指点。
你的文件是不是太大了?
然后再对Memo进行处理不知道会不会快,我先看看。
2、处理
//取出一行到s,略
sValue:= ''''+AnsiReplaceStr(s,' ',''',''')+'''';
sql := 'insert into tmptable values(' + sValue +')';
//执行sql,略
所有行处理完后,再把tmptable的数据进行类型转换导入目的表,这用一个sql应该就可以完成
emial:[email protected]
不可能90多行需要秒级~~
主要是优化插入数据库的代码~~
如果是SQL Server,生成一序列插入语句而后执行批处理试试~~//....
begin
if not OpenDialog1.Execute then Exit;
AssignFile(f,OpenDialog1.FileName);
Reset(f); ts:=TstringList.Create; //##不用放在循环里,每次都创建
while not eof(f) do
begin
readln(f,line);
if trim(line)='AA' then Exit;
ts.Clear; //##清除一下
ExtractStrings([' '],[],Pchar(line),ts);
... //其它语句
end;
ts.Free;
CloseFile(f); //##文件要关闭
end;
前面的那句把所有的空格换成逗号,下面这句我就看不懂。
sql := 'insert into tmptable values(' + sValue +')';
把insert into 语句写在循环外,写入值都用参数,values(:参数,...)
在循环中给参数赋值,执行.这样比直接用sql := 'insert into tmptable values(' + sValue +')'快n倍.
ExtractStrings([' '],[],Pchar(line),ts);
for j:=20 downto 0 do //暂时取20个值
str[i][j]:=ts[j];
这样做,在赋值的时候肯定会慢的。我把 ts改为ts:array [0..95] of TStringList;
下面改为:
ExtractStrings([' '],[],Pchar(line),ts[i]); 到ts[i]出错。<-是不是和ts:TStringList 的ts[i]冲突?