做一财务系统,需要从文本文件中导入大量的财务数据,数量超过十万,以前采用的方法是使用TStringList.LoadFromFile读取数据,然后逐行分解,但是这个方法只能用于小型的数据集合,在我的实际使用中,导入超过十万行的时候,速度无法令人忍受,请教有没有更好的方法!

解决方案 »

  1.   

    TStringList确实效率不搞,建议直接用delphi的文件处理过程
    uses
        FileCtrl;
    var
        F: TextFile;
        s: String;
        i: Integer;
    begin
            AssignFile(F, FileName);
            Reset(F);
            while not Eof(F) do
            begin
                Readln(F, s);
                //这里写处理过程
            end;
            CLoseFile(F);
    end;
      

  2.   

    TStringList.LoadFromFile好像直接写入到内存中了,机器怕是要爆掉。直接用TxtFile来Readln不行吗?
      

  3.   

    运用ClientDataSet.savetofile保存文件
    然后用ClientDataSet1.loadfromfile装载数据
    最后进行数据处理
      

  4.   

    运用ClientDataSet.savetofile保存文件
    然后用ClientDataSet1.loadfromfile装载数据
    最后进行数据处理
      

  5.   

    我认为用内存映射文件比较好,这是最直接的方法了
        将文本文件映射成映射文件,就可以向处理字符串一样来处理文本文件了
        通过简单的解析,按记录添加到数据库
        当然Insert十几万次是避免不了了,但文本文件操作你绝对放心,映射之后,文件操作完全交给系统来管理
      

  6.   

    我用TStringList 导入过80万行记录,每条记录20字节。很快,也就几秒钟。我自己写的直接操作文件的都没这么快,不知道为甚么。你这十万纪录需要解决的真正的瓶颈应该是写入数据库的时候,读出来很快的。
    80万纪录我写入sqlserver 大约写了30分钟(PIII 700/512M)。
      

  7.   

    你可以
    1 用DTS和BCP
    2 用查询数据集:
    下面是个查询的示例,它通过用于 Jet 的 OLE DB 提供程序查询 Excel 电子表格。SELECT * 
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
      'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...--------------------------------------
    看见了么,
    那支蛾子,
    正飞向太阳,
    那就是我!
    --------------------------------------