现有.txt文件.格式如下:
2004-12-08|15:11||105706|5|||| ...... |-15|
每行为一条记录.一般情况下有1万(10000)条记录.文件大小为8-10M.其中两竖线中间没有东西的代表这个字段为空.现有table结构如下:
data varchar(20)
time varchar(20)
.
.
.
fg varchar(20)
共有800个字段,每个字段都用的varchar(20).现求一方法把.txt内容导入现有表中.要求速度快.用程序实现.在线等.....
如100分不够,我可再开贴给分.感谢!顶者有分.
2004-12-08|15:11||105706|5|||| ...... |-15|
每行为一条记录.一般情况下有1万(10000)条记录.文件大小为8-10M.其中两竖线中间没有东西的代表这个字段为空.现有table结构如下:
data varchar(20)
time varchar(20)
.
.
.
fg varchar(20)
共有800个字段,每个字段都用的varchar(20).现求一方法把.txt内容导入现有表中.要求速度快.用程序实现.在线等.....
如100分不够,我可再开贴给分.感谢!顶者有分.
代码很简单,快不快我不知道,哈哈。
~~ ^_^ ~~
Strs :TStrings
……
Strs.CommaText := StringReplace(你的字符串,'|',#13,[]);
能把你的想法说的更详细点.我是已经建好表结构了的.如果是一个字段一个字段的赋值的话,估计不行哦.太慢了.
用insert 也不能完整的插入一条记录,语句太长.800字段.继续等待.
谢谢你的意见,但好像是有一种方法就是导入数据到数据库,就像DTS。
但我又不能用DTS,我要用程序实现。DTS好像是不能导入到已有库结构中。字段名也是Col001 Col002 ...... Col801 继续等待...
var
i:integer;
str_sql:WideString;
begin
str_sql := 'CREATE PROCEDURE insert_data ' + #13;
str_sql := str_sql + 'AS' + #13;
str_sql := str_sql + 'BEGIN' + #13;
Memo1.Lines.LoadFromFile('D:\Data.txt');
for i := 0 to Memo1.Lines.Count - 1 do
begin
str_sql := str_sql + 'INSERT INTO table (data,...,fg) VALUES ('''+
AnsiReplaceStr(Memo1.Lines.Strings[i], '|', ''',''');
str_sql := str_sql +''')';
end;
str_sql := str_sql + 'END' + #13;
str_sql := str_sql + 'GO' + #13;
str_sql := str_sql + 'EXEC insert_data ';
with ADOQuery1 do
begin
ConnectionString := '...';
Close;
SQL.Clear;
SQL.Add(str_sql);
ExecSQL
end;
end;
我想除了直接用存储过程外,没有其它更快的办法了。但是用存储过程怎么去处理这个文件?
你还是去SQL区问问吧,呵呵。
EXEC master..xp_cmdshell 'bcp "dbname..tablename" in c:\DT.txt -c -Sservername -Usa -Ppassword'
谢谢你的解释。
你的下面的语句再想一下看,看是否可用。 str_sql := str_sql + 'INSERT INTO table (data,...,fg) VALUES ('''+
AnsiReplaceStr(Memo1.Lines.Strings[i], '|', ''',''');有801列哦。单是列出列名,这条SQL语句就会出错了。说是语句的长度不能超出80xx多少不太记得了。可以先insert 一部分。后再添加一部分。但好慢好慢。
Kevin_Lmx(繁华阅尽)
谢谢你的见意。我现在就去开个贴,链到这里来。
你的方法有点个性哦。
请说更详细点,小弟很菜的。谢谢!
CSDN的兄弟们。
如果用的MSSQL,调用扩展存储过程xp_cmdshell,执行bcp 实用工具可以实现大批量导入数据
数据文件格式可以参考MSSQL的在线帮助--bcp 实用工具, 格式文件
别的数据库系统应该也有类似的办法,例如DB2就有import.当然,文件格式可能和数据库系统的不同,就修改吧。如果是我,立马拿个UltraEdit来查找替换,噼里啪啦,一般都没有什么问题。老这么干。如果实在要用程序来倒入的话,就要控制好Commit的时机了,否则,慢死你没有商量。
can do reference ado 2.0 help
你是说的
/** 导入文本文件
EXEC master..xp_cmdshell 'bcp "dbname..tablename" in c:\DT.txt -c -Sservername -Usa -Ppassword'如果用的MSSQL,调用扩展存储过程xp_cmdshell,执行bcp 实用工具可以实现大批量导入数据
数据文件格式可以参考MSSQL的在线帮助--bcp 实用工具, 格式文件这个方法吗?各位大侠啊.还有没有更好的办法呢?
就是对文件进行列的遍历,把每次得到的值入库,这样一来对库的操作是800*文件行数.
也可以批量入库,一次入库多个字段/多个行.逐步调优吧.减少入库次数.
不是很成熟的想法.呵呵
Excel只支持255列. delphfan(AMU)
速度会很慢.我在这里说的一万行还是保守之中的保守数字. 真没法子了吗?
这里是这样的,每天200-500个文件,10000行/文件,48列.每个月2G空间被吃掉.
我的思路是这样的,做个实时的CONSOL进程,读取文件存储目录的文本,解析后入库,并同时将文件移到BACKUP目录去.然后根据分析要求,对每天入库库表查询,生成报表后,将入库的记录清除.慢是慢点,但因为是自动的过程,只需要检查报表生成情况就可以了.
大家看看,给点建议吧
USE TabName
APPE FROM AA.TXT DELIMI WITH '|'
将 | 替换成豆号加引号( ',' ) 即:
2004-12-08|15:11||105706|5|||| ...... |-15| 替换成:
2004-12-08','15:11','105706','5' ...... ,'-15','
然后最字符串流读取每一行,并在每一行前加上 Insert into table values (' 即:
Insert into table values ('2004-12-08','15:11','105706','5' ...... ,'-15','
时同在每一行的最后册除( ,' )并加上( ) ) 即:
Insert into table values ('2004-12-08','15:11','105706','5' ...... ,'-15')
最后将字符串文件保存为 *.SQL 文件
后面的部分不用我说都知道怎么做吧.....
SampsonDyh(阿辉)
你的方法我还没有去验证,但看起来好像挺好的.
谢过.^-^谢谢大家的意见.下次我提问题再见.^-^