分享

请教csv文件导入SQLITE数据库代码

 quasiceo 2017-06-25
标题:
请教csv文件导入SQLITE数据库代码 浏览:173
加入我的收藏
楼主: 用SQLITE的命令行导入csv等有标准分隔符的文件非常快,命令是.import table csv文件
但用命令行很麻烦,想在程序代码里面实现,但速度很慢。
我现在用的方法是调用sqlite3.dll,先把csv加到tstringlist里面,然后一行行的insert 数据库
用了事务处理,速度有所提高,但还是比命令行慢多了
请问有没有什么快的办法?读了sqlite的源码,没读懂
----------------------------------------------
-

作者:
男 a5824 (Return) ▲▲▲△△ -
注册会员
2017-6-23 17:22:01
1楼: 整个提交到数据库,别一行行提交
----------------------------------------------
逗逼 逗逼,站住!我要追上你
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲△ -
普通会员
2017-6-23 17:28:09
2楼: 开启事务。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 delphiilove (箭候) ▲▲▲▲▲ -
普通会员
2017-6-24 0:04:43
3楼: 用 Navicat 管理工具
----------------------------------------------
God with US
作者:
男 hnljs (竹寨) ▲▲▲▲▲ -
盒子活跃会员
2017-6-24 8:00:25
4楼:
procedure Tdm.ImportCSV(const asql: string);

var
MyTextFile:Textfile;
str, AFileName:string;
i,j,k,H,jl:integer;
 dd :array of string;
 TimeCount: TStopwatch;
 arr:  TArray<String>;

begin

OpenDialog1.Title := '请选择要打开的文件';
 OpenDialog1.Filter := '数据文件(*.txt)|*.txt|*.CSV|*.*';

 if  OpenDialog1.Execute()   then


begin

// showmessage(  OpenDialog1.FileName);


  Screen.Cursor:=crHourGlass;
  Application.CreateForm(Twaitform,waitform);
   waitform.Panel1.Caption :='正在导入数据,请等候..........';
waitform.Show;
waitform.Update ;


 AssignFile(MyTextFile,OpenDialog1.FileName );
  TimeCount := TStopwatch.Create;
 TimeCount.Start;



 Reset(MyTextFile);

 // ASQL:='INSERT INTO TEST(ID,NAME) VALUES (:ID,:NAME)';

 FQRY.FetchOptions.AutoClose := False; //
  FQRY.SQL.Text := ASQL;
 jl:=100000;
  FQRY.Params.ArraySize:=jl ; //准备把上面的语句执行 j 次


   H:=0;
   J:=0;

     // 文件第一行是标题

     if True then

     Readln(MyTextFile, str);



 while not Eof(MyTextFile) do
  begin
    Readln(MyTextFile, str);

    str:=str.Replace('"', '');
   arr:=str.Split([',']);
       for K := 0 to fqry.ParamCount -1 do
      BEGIN
          FQRY.Params[K].AsStrings[H] :=arr[k];

      END;

          inc(h);
   if  (H=jl) OR  Eof(MyTextFile)  then
     BEGIN
      J:=J+H;

       FConn.StartTransaction;
        TRY
       FQRY.Execute(h-1, 0);
         FConn.Commit;   //提交
         h:=0;
        except

         on E: Exception do
          begin
          dm.Fconn.Rollback ;
//  showmessage(asql);
        //     Application.ShowException(e.className,':',e.Message);
          end;


        END  ;


        end;

    END;


  end;



  CloseFile(MyTextFile);



    TimeCount.Stop;


    Screen.Cursor:=crDefault;
 waitform.FREE;
 //   showmessage(inttostr( Length(arr)));
    showmessage(format('追加记录 %D 条, 用时:%f秒'  ,[J, TimeCount.ElapsedMilliseconds / 1000]));




 end;
----------------------------------------------
-
作者:
男 hnljs (竹寨) ▲▲▲▲▲ -
盒子活跃会员
2017-6-24 8:06:20
5楼: 数据导入截图
此帖子包含附件:
JPEG 图像
大小:25.0K
----------------------------------------------
-
作者:
男 delphiilove (箭候) ▲▲▲▲▲ -
普通会员
2017-6-24 11:21:57
6楼: 用 FireDAC 的 ArrayDML ,我试过 每秒 10 万条。
----------------------------------------------
God with US
作者:
男 wzwcn (wzw) ▲▲▲▲▲ -
普通会员
2017-6-24 12:32:54
7楼: 开启事务,批量提交而不是每条都提交一次或全部插完再提交。比如每插200条就提交一次,这样会快很

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多