现有.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分不够,我可再开贴给分.感谢!顶者有分.

解决方案 »

  1.   

    可以这样:用StringReplace把'|'换为#13,再导到一个Strings里面,然后就写进数据库罗。
    代码很简单,快不快我不知道,哈哈。
    ~~ ^_^ ~~
    Strs :TStrings
    ……
    Strs.CommaText := StringReplace(你的字符串,'|',#13,[]);
      
      
      

  2.   

    Kevin_Lmx(繁华阅尽) 
    能把你的想法说的更详细点.我是已经建好表结构了的.如果是一个字段一个字段的赋值的话,估计不行哦.太慢了.
    用insert 也不能完整的插入一条记录,语句太长.800字段.继续等待.
      

  3.   

    YichengWang(◎◎◎◎) 
    谢谢你的意见,但好像是有一种方法就是导入数据到数据库,就像DTS。
    但我又不能用DTS,我要用程序实现。DTS好像是不能导入到已有库结构中。字段名也是Col001  Col002 ...... Col801 继续等待...
      

  4.   

    偶是来把三楼的解释的详细一点^_^procedure TForm1.Button1Click(Sender: TObject);
    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;
      

  5.   

    To 楼主:
        我想除了直接用存储过程外,没有其它更快的办法了。但是用存储过程怎么去处理这个文件?
        你还是去SQL区问问吧,呵呵。
      

  6.   

    /**  导入文本文件  
    EXEC  master..xp_cmdshell  'bcp  "dbname..tablename"  in  c:\DT.txt  -c  -Sservername  -Usa  -Ppassword'
      

  7.   

    luke5678(奇异) 
    谢谢你的解释。
    你的下面的语句再想一下看,看是否可用。 str_sql := str_sql + 'INSERT INTO table (data,...,fg) VALUES ('''+
                   AnsiReplaceStr(Memo1.Lines.Strings[i], '|', ''',''');有801列哦。单是列出列名,这条SQL语句就会出错了。说是语句的长度不能超出80xx多少不太记得了。可以先insert 一部分。后再添加一部分。但好慢好慢。
     Kevin_Lmx(繁华阅尽) 
    谢谢你的见意。我现在就去开个贴,链到这里来。
      

  8.   

    luke5678(奇异)
    你的方法有点个性哦。
    请说更详细点,小弟很菜的。谢谢!
      

  9.   

    >>你的方法有点个性哦  这种方法庸的很
      

  10.   

    有没有更好的方法啊。
    CSDN的兄弟们。
      

  11.   

    还是参考我给你的第二个方法吧
    如果用的MSSQL,调用扩展存储过程xp_cmdshell,执行bcp 实用工具可以实现大批量导入数据
    数据文件格式可以参考MSSQL的在线帮助--bcp 实用工具, 格式文件
      

  12.   

    如果是MSSQL的话,用数据导入导出工具,就可以了。
    别的数据库系统应该也有类似的办法,例如DB2就有import.当然,文件格式可能和数据库系统的不同,就修改吧。如果是我,立马拿个UltraEdit来查找替换,噼里啪啦,一般都没有什么问题。老这么干。如果实在要用程序来倒入的话,就要控制好Commit的时机了,否则,慢死你没有商量。
      

  13.   

    uses adox,
    can do reference ado 2.0 help
      

  14.   

    如果是oracle,在程序里面写ctl控制文件,用createprocess调用sqlldr,对于大数据量数据导入非常快,缺点是必须安装sqlldr工具。
      

  15.   

    luke5678(奇异) 
    你是说的
    /**  导入文本文件  
    EXEC  master..xp_cmdshell  'bcp  "dbname..tablename"  in  c:\DT.txt  -c  -Sservername  -Usa  -Ppassword'如果用的MSSQL,调用扩展存储过程xp_cmdshell,执行bcp 实用工具可以实现大批量导入数据
    数据文件格式可以参考MSSQL的在线帮助--bcp 实用工具, 格式文件这个方法吗?各位大侠啊.还有没有更好的办法呢?
      

  16.   

    上面的大侠们说的没错,可以用SQLLOADER或BCP,如果非得用算法实现,分拆成列入库;
    就是对文件进行列的遍历,把每次得到的值入库,这样一来对库的操作是800*文件行数.
    也可以批量入库,一次入库多个字段/多个行.逐步调优吧.减少入库次数.
    不是很成熟的想法.呵呵
      

  17.   

    哇,還不如把它搞在excel裡去後再轉到數據庫裡。
      

  18.   

    postfxj(探索者) 
    Excel只支持255列. delphfan(AMU) 
    速度会很慢.我在这里说的一万行还是保守之中的保守数字. 真没法子了吗?
      

  19.   

    楼主啊,昨天才回复的,没想到今天我就遇见同样的问题了.呵呵;
    这里是这样的,每天200-500个文件,10000行/文件,48列.每个月2G空间被吃掉.
    我的思路是这样的,做个实时的CONSOL进程,读取文件存储目录的文本,解析后入库,并同时将文件移到BACKUP目录去.然后根据分析要求,对每天入库库表查询,生成报表后,将入库的记录清除.慢是慢点,但因为是自动的过程,只需要检查报表生成情况就可以了.
    大家看看,给点建议吧
      

  20.   

    用VFP可快速导入:
    USE TabName
    APPE FROM AA.TXT DELIMI WITH '|'
      

  21.   

    首先格式化一下文本:
    将 | 替换成豆号加引号(  ',' ) 即:
    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 文件
    后面的部分不用我说都知道怎么做吧.....
      

  22.   

    本来昨天要结的,但出去有点事去了.晚了一天,不好意思啊.^-^
    SampsonDyh(阿辉)
    你的方法我还没有去验证,但看起来好像挺好的.
    谢过.^-^谢谢大家的意见.下次我提问题再见.^-^