本人要完成一个对数据分析的模块,需要把原始数据导入到数据库中,原始数据为文本文件,格式如下,(时间格式,整数,和十六进制的整数,字段用','隔开)
2002-09-20 08:18:00.340,12,3a4f,……
数据量比较大,请问怎么用Dephi快速导入到数据库中(还需要对其中一个字段进行转换)。
我以前用Table,读一条记录就Append,Append多条后就Post,结果发现其实Append后数据就已经到数据库中去了,那么这样实际就是一条一条入库,效率应该很低。各位大侠不知有没有更好的办法?
另外,读入原始文件怎么读入效率高,用文件流怎么样?怎么读入呢?一个一个字节读入判断还是一行读入再做处理好呢?
谢谢!

解决方案 »

  1.   

    可以使用tquery控件,将每条记录整合成sql语句,然后将几条语句拼装执行,虽然也要遍历,但是效率可定打的多
    文本还是一行行的读好,如果你的文本一行就是一条记录的所有数据的化
      

  2.   

    AnsiString gameno,cname,nno,sex,birth,heigth,weigth,cteam ,tno,steam,sno,item,ino,best,res,rank,kind,re;
       AnsiString sql;
       AnsiString S[18];    TStrings *pList=new TStringList();
         pList->LoadFromFile("e:\\hehe.txt"); for(int i=0;i<pList->Count-1;i++)
      { S[i]=pList->Strings[i];
        p=S[i].Pos(',');
        gameno=S[i].SubString(1,p);
        S[i].Delete(1,p);
        cname =S[i].SubString(1,p=S[i].Pos(',')) ;
        S[i].Delete(1,p);
        nno   =S[i].SubString(1,p=S[i].Pos(','));
        S[i].Delete(1,p);
        sex   =S[i].SubString(1,p=S[i].Pos(','));
        S[i].Delete(1,p);
        birth  =S[i].SubString(1,p=S[i].Pos(','));
        S[i].Delete(1,p);
        heigth =S[i].SubString(1,p=S[i].Pos(','));
        S[i].Delete(1,p);
        weigth =S[i].SubString(1,p=S[i].Pos(','));
        S[i].Delete(1,p);
        cteam  =S[i].SubString(1,p=S[i].Pos(','));
        S[i].Delete(1,p);
        tno    =S[i].SubString(1,p=S[i].Pos(','));
        S[i].Delete(1,p);
        steam  =S[i].SubString(1,p=S[i].Pos(','));
        S[i].Delete(1,p);
        sno   =S[i].SubString(1,p=S[i].Pos(','));
        S[i].Delete(1,p);
        item   =S[i].SubString(1,p=S[i].Pos(','));
        S[i].Delete(1,p);
        ino   =S[i].SubString(1,p=S[i].Pos(','));
        S[i].Delete(1,p);
        best   =S[i].SubString(1,p=S[i].Pos(','));
        S[i].Delete(1,p);
        res   =S[i].SubString(1,p=S[i].Pos(','));
        S[i].Delete(1,p);
        rank   =S[i].SubString(1,p=S[i].Pos(','));
        S[i].Delete(1,p);
        kind   =S[i].SubString(1,p=S[i].Pos(','));
        S[i].Delete(1,p);
        re=S[i].Trim();
        sql="insert into ydy (gameno,cname,nno,sex,birth,heigth,weigth,cteam ,tno,sno,item,ino,best,res,bank,kind,re)\
                    value  ("+gameno+""+cname+""+nno+""+sex+""+birth+""+heigth+""+weigth+""+cteam+""+tno+""+sno+""+item+""+ino+""+best+""+res+""+rank+""+kind+""+re+")";
          }
    Query->SQL->Add(sql)
      

  3.   

    存储文件
    procedure TForm1.Button2Click(Sender: TObject);
    var str:Tmemorystream;
    begin
    str:=Tmemorystream.Create;
    str.Position:=0;
    Tblobfield(adoquery1.FieldByName('tt')).savetostream(str);
    str.SaveToFile('c:\a.word');
    str.Free;
    end;
    读出文件
    procedure TForm1.Button1Click(Sender: TObject);
    var str:Tmemorystream;
    begin
    str:=Tmemorystream.Create;
    str.LoadFromFile('f:\page.pas');
    str.Position:=0;
    adoquery1.Append;
    Tblobfield(adoquery1.FieldByName('tt')).loadfromstream(str);
    try
    adoquery1.Post;
    finally
    str.Free;
    end;
    end;
      

  4.   

    to delphi_han(呵呵) 
    好像是一条记录就insert一次,有没有批量导入的办法啊?to  timelyraining(jack_feng)
    如果某个字段要修改一下怎么办呢?比如十六进制到十进制?
      

  5.   

    其实吧,你的要求sql server2000的数据导入程序就可以完成
      

  6.   

    是啊,用SQL SERVER的DTS很容易完成你的需求。
      

  7.   

    开始-->程序-->Microsoft SQL Server-->导入导出工具-->一切OK
      

  8.   

    在DELPHI的SOURCE下有一个处理文本数据的控件可以用
      

  9.   

    to all
    用SQL 工具是可以导入数据,但是那样用户用起来不方便,我需要的是自动导入,并不是一个文件,以后还有新的文件会实时不断产生需要导入。如果只是自己做个测试,当然可以这样了。
    而且,SQL自动导入不支持类型转换,比如字段是十六进制的,怎么导入到整数字段里去呢?
      

  10.   

    to xunji(呵呵,MM,我想……) 和shine_yzl(【菜鸟苯苯】●◆■▲) 
    能不能具体一点,比如给个例子。
    谢谢!