关于文本数据读取后导入数据库的问题
我有如下类似数据,规则如下:
1、每个单位的记录的起始位置(即第一行)用'================'标明
2、第二行为邮编等信息
3、第三行单位名称等信息
4、第四行要取的信息为单位地址等
5、第五行开始以'----------------'为标志是清单记录开始(记录条数因各单位而不定)
直到:再次出现'======================='表明另外一个单位的数据开始
6、其中每一行中的数据再以'$'符为字段分隔符,并且是定长的
=========================================================================================
1092365482342585861289NHMD16836573751030200500002$00001    $07207    $510001$  //取邮编
1092365482342585861289NHMD16836573759040**市***大厦**栋*楼***座   //取地址
1092365482342585861289NHMD16836573759050**市***有限公司           //取单位名称
1092365482342585861289NHMD16836573759070-------------------------------------------------
//该单位的清单开始(清单数目因各单位实际而不同,字段以$符分隔,且字段定长)(要取各字段)
1092365482342585861289NHMD16836573759100090713$TH01000801$ $  $          172,000.00$
1092365482342585861289NHMD16836573759120090717$8632000419$ $  8,000.00$            $
=========================================================================================
//下一单位的数据由此开始(即'====='是单位间隔标志符)
问各位大侠:如何做才好?

解决方案 »

  1.   

    还有发帖的时候将我的数据自动换行了,重新贴==============================================================================
    1092365482342585861289NHMD16836573751030200500002$00001$07207$510001$ //取邮编
    1092365482342585861289NHMD16836573759040**市***大厦**栋*楼***座   //取地址
    1092365482342585861289NHMD16836573759050**市***有限公司           //取单位名称
    1092365482342585861289NHMD16836573759070--------------------------------------
    //该单位的清单开始(清单数目因各单位实际而不同,字段以$符分隔,且字段定长)(要取各字段)
    1092365482342585861289NHMD16836573759100090713$TH01000801$ $  $          172,000.00$
    1092365482342585861289NHMD16836573759120090717$8632000419$ $  8,000.00$            $
    ==============================================================================
    //下一单位的数据由此开始(即'====='是单位间隔标志符)
      

  2.   

    一行一行的读
    一个一个字符的分析
    一句一句的INSERT
      

  3.   

    我在以前用php+mysql做过类似的东西:
    将整个文本文件读入到一个数组变量($file)中,而文本文件里边的每行字符串可以作为数组的一个元素直接访问(比如$file[0]就是文本文件的第一行字符串)。最关键的还是每个数组元素的变量可以再次以分割符来切分,最后将切分的结果循环插入数据库。
    小弟因工作需要刚接触delphi,不知道是否可以实现类似的功能,向大侠们求助!
    有什么好的方法或者好的函数介绍,请告知,谢谢!
      

  4.   


    delphi中字符串本身就是一个数组,每一个字符为一个单元,既然数据都是定长的,可通过分析找出个字段的下标规律,只是不知道该文件有多大
      

  5.   

    一般文本数据都有30M左右。
    像TStringList之类的能不能像数组那样方便操作?主要是可不可以将读入的整个文本的单行字串再进行部分截取操作?
    或者读入到memo里可不可以实现这样的操作呢?
      

  6.   

    CSV是以“,”为分割符的,通过分析也好处理的
      

  7.   

    读出一行后,可以把读出的字符串进行分解,存入到数组或TStringList中去,再往表中导即可
      

  8.   

    to smiler007(笑一笑)
    读出一行后,可以把读出的字符串进行分解,存入到数组或TStringList中去,再往表中导即可
    --------------------------------------------------
    这个就跟我的想法相一致了
    不过要真是对于每一行都要做到一个字符一个字符来分析就麻烦了
    有没有读取定长的函数或方法?
    因为在清单的行中是规则的以';'为分隔并且字符串是定长的
      

  9.   

    30m的东西能一次放进tstringlist里面吗?
    如果可以的话,在读的过程中,把每天记录合并放到一起中间加个分隔符
    再倒数据库里面去
    处理文本 其实用ultraedit 更方便 先把格式处理好,倒就方便
    有没有读取定长的函数或方法?用copy就行了,只要你的数据长度统一
      

  10.   

    我的做法是先将文本读入到TStringList
    然后在每行的特定位置截取所要的字符串(赋值给变量),但是插入数据库的时候却老是出错
    不知为何(就是不知如何将该变量传给sql语句)
    请问该如何作数据库的插入操作?
      

  11.   

    sql语句的拼接,插入出错,你把那句sql语句提出来看看
      

  12.   

    var
       s:TStringList;   s := TStringList.Create();
       s.LoadFromFile('d:\a_.txt');   
       yb_a := copy(s.Strings[i+2],75,6);
       addr_a := copy(s.Strings[i+3],41,60);如下语句出错:
                      query1.SQL.Clear;
                      query1.SQL.Add('insert into tab_test values(:yb_a,:addr_a,:dw_a,:zh_a)')
                      ParamByName('yb_a').AsString := yb_a;
                      ParamByName('addr_a').AsString := addr_a;
                      ParamByName('dw_a').AsString := dw_a;
                      ParamByName('zh_a').AsString := zh_a;
                      ExecSQL;改成:table1.Fields[0].AsString := yb_a;(用ttable控件来做插入一样会出错)我再改用adoTable控件来做,还是出错。没撤了.....
                        ADOTable1.Insert;
                        ADOTable1['yb']:=yb_a;
                        ADOTABLE1['txaddr']:=addr_a;
                        ADOTable1.Post;
                        ADOTable1.next;注:tab_test为vfp建立的数据表哪位有经验的大哥给说说吧,我愿意另外开帖给分,谢谢!
    实在是烦闷极了....
      

  13.   

    用table1.Fields[0].AsString := yb_a;方式做的话,似乎更接近成功
    提示的错误是:Table1:Dataset not in Edit or Insert Mode我是刚接触delphi的超级菜鸟,如果那位大哥大姐能够好心指出我所犯的错误,或者能够用方法解决我遇到的问题,非常感谢!
    郁闷着...
      

  14.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
            s:TStringList;
            str:string;        nPos:integer;
            i:integer;
    begin
            s := TStringList.Create();
            s.LoadFromFile('d:\a_.txt');
            for i:=0 to s.count-1 do
              begin
                if copy(s.Strings[i],41,1) = '=' then
                  begin
                  if copy(s.Strings[i+2],38,2) = '03' then
                    begin
                    
                    bz := copy(s.Strings[i+2],71,3);
                    Label1.Caption := bz;
                    
                    
                    //str := copy('小素',1,2);
                    yb_a := copy(s.Strings[i+2],75,6);
                    addr_a := copy(s.Strings[i+3],41,60);
                    dw_a := copy(s.Strings[i+4],41,40);
                    zh_a := copy(s.Strings[i+5],41,18);
                    //
                      begin
                      Label2.Caption := yb_a;   //程序到此位置还是正常的,一旦涉及下面的插入操作就出问题了
                      table1.Fields[0].AsString := yb_a;
                       
                        end;
                    end;
                  //if copy(s.Strings[i+8],39,1) = '9' then
                    //for j:=0 to strtoint(copy(s.Strings[i+j+1],38,2)) do              end;
              end;
            //s.free;
    end;
      

  15.   

    我再间化一下,删改得太乱了:)
    var
           s:TStringList;
           str:string;
           bz,yb_a,addr_a,dw_a,zh_a:string;
    begin
            s := TStringList.Create();
            s.LoadFromFile('d:\a_.txt');
            bz := copy(s.Strings[i+2],71,3);
            yb_a := copy(s.Strings[i+2],75,6);
            addr_a := copy(s.Strings[i+3],41,60);
            dw_a := copy(s.Strings[i+4],41,40);
            zh_a := copy(s.Strings[i+5],41,18);    //这些变量均正常能取值          begin
                      Label2.Caption := yb_a;
                      table1.Fields[0].AsString := yb_a;(问题将从这开始....)
              end;
    end;
      

  16.   

    改为:
    j:integer;
    with Table1 do
        begin
          Open;
                 for  j:=1 to 4 do
                  begin
                    Append;        //插数据前别忘了
                    table1.fields[j-1].AsString := yb_a;  //测试yb_a是否能顺利插入
                    post;
                  end;
        end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      Table1.Active := true;//运行时要激活Table的Active属性
    end;