文本文件每行如下格式:
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函数的处理好象比我这个还要复杂,总之两个都慢,是不是文件的读取方式有问题,还望高手指点。

解决方案 »

  1.   

    Extractstrings应该比你哪个更慢,因为它的适应性更强
    你的文件是不是太大了?
      

  2.   

    to :vavyboyleon(一天到晚加班的驴) 文件不是大,而是很多,每个文件只有96行,要进行批量的处理这样就显的慢了。如果单行处理的话,基本上是看不到两种处理方式的差别。是不是文件的读取有问题,如果用Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
    然后再对Memo进行处理不知道会不会快,我先看看。
      

  3.   

    如果你的分隔符是固定长度,并且每个位置都有数据的话,我建议这样做1、建立一个临时表tmptable和文本文件的字段对应,每个字段均用字符型
    2、处理
    //取出一行到s,略
    sValue:= ''''+AnsiReplaceStr(s,' ',''',''')+'''';
    sql := 'insert into tmptable values(' + sValue +')';
    //执行sql,略
    所有行处理完后,再把tmptable的数据进行类型转换导入目的表,这用一个sql应该就可以完成
      

  4.   

    我有几种方法,能否给我完整一个文本文件,让我做一下速度对比测试?
    emial:[email protected]
      

  5.   

    to: bluz() 先实验。to: cuiy2000(cuiy) 已经发出,请查收。多谢楼上各位!
      

  6.   

    如果文件不大,字符处理的速度是很快的~~
    不可能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;
      

  7.   

    伴水也来了! 我的代码这点是要改,文件关闭忘了复制上去了。数据库是ORCLE,服务器的配置很差(开发临时的配置),数据插入的时候还受网络好坏的影响,因此慢也可以理解,但是我做的也慢的出奇,算法不对,我再试试你们的方法。to  bluz();
    前面的那句把所有的空格换成逗号,下面这句我就看不懂。 
    sql := 'insert into tmptable values(' + sValue +')';
      

  8.   

    提高往数据库写的速度方法
    把insert into 语句写在循环外,写入值都用参数,values(:参数,...)
    在循环中给参数赋值,执行.这样比直接用sql := 'insert into tmptable values(' + sValue +')'快n倍.
      

  9.   

    使用存储过程+ADO速度会更快!我做了一个和你的相反,是把数据库的数据写到文本文件中,十万条记录就用了不到30秒。
      

  10.   

    其实不是文件的操作的问题,还是往数据库里插入的方法的算法有问题,现在修改了算法,程序快了很多,我现在的做法是用一个二维数组用来放临时的值把上面的改为:
       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]冲突?
      

  11.   

    to:gencan(无敌)  是说我的代码?