|
|
导航: |
论坛 -> 数据库专区
斑竹:liumazi,waterstone |
|
作者: |
|
2017/6/23 14:14:16 |
标题: |
请教csv文件导入SQLITE数据库代码 |
浏览:2184 |
|
加入我的收藏 |
楼主: |
用SQLITE的命令行导入csv等有标准分隔符的文件非常快,命令是.import table csv文件 但用命令行很麻烦,想在程序代码里面实现,但速度很慢。 我现在用的方法是调用sqlite3.dll,先把csv加到tstringlist里面,然后一行行的insert 数据库 用了事务处理,速度有所提高,但还是比命令行慢多了 请问有没有什么快的办法?读了sqlite的源码,没读懂
----------------------------------------------
- |
作者: |
a5824 (Return) |
★☆☆☆☆ |
-
|
普通会员 |
|
2017/6/23 17:22:01 |
1楼: |
整个提交到数据库,别一行行提交
----------------------------------------------
-
|
作者: |
|
2017/6/23 17:28:09 |
2楼: |
开启事务。
----------------------------------------------
(C)(P)Flying Wang
|
作者: |
|
2017/6/24 0:04:43 |
3楼: |
用 Navicat 管理工具
----------------------------------------------
-
|
作者: |
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楼: |
数据导入截图
此帖子包含附件:
大小:25.0K |
----------------------------------------------
-
|
作者: |
|
2017/6/24 11:21:57 |
6楼: |
用 FireDAC 的 ArrayDML ,我试过 每秒 10 万条。
----------------------------------------------
-
|
作者: |
|
2017/6/24 12:32:54 |
7楼: |
开启事务,批量提交而不是每条都提交一次或全部插完再提交。比如每插200条就提交一次,这样会快很多
----------------------------------------------
-
|
作者: |
|
2017/6/27 13:05:17 |
8楼: |
http://zeoslib.sourceforge.net/viewtopic.php?t=3624
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。又不靠它 delphi 吃饭,怕甚?
|
作者: |
|
2017/6/28 8:12:08 |
9楼: |
to delphiilove,能给个示例吗?
----------------------------------------------
delphier
|
|