dbgrid.Columns.LoadFromFile(s) 这是如何用啊

解决方案 »

  1.   

    不同的数据库的表的存放格式是不一样的,所以,你要用UltraEdit之类的工具打开一个表来看看具体数据存放格式。然后,你要根据具体数据存放格式来调整你的输入格式,进行导入,可以用直接写文件法,也可以用ClientDataSet的LoadFromFile/SaveToFile法(在此之前,你SaveToFile一下,看看生成的文件的格式),有问题再问吧。
      

  2.   

    读入文件的每一行后,根据你的文件分隔符,逐一取出数据。
    例如:
    srcstr := 'xxx' --每行的内容
    tmpstr := copy(srcstr,1,length(srcstr) - pos(' ',srcstr)); --取出姓名
    table1.fieldbyname('姓名').asstring := copy(tmpstr,pos(':',tmpstr),length(tmpstr) - pos(':',tmpstr)); -- 写入数据库因为包含多个字段,所以上面的操作实际应当运用循环完成;为了使循环能顺利进行,对srcstr、tmpstr的控制比较重要;当然还要考虑到字段值为空的情况。
      

  3.   

    cobi(小新国际)的方法很好!,但要做一些有效性校验。
      

  4.   

    用DELPHI该如何做
    v_long:=0;
       v_length:=0;
       for i:=v_length to length(s) do
       begin
          v_str:=copy(s,pos(' ',s),length(s));
          stringlist.Add(v_str);
       end;
    我现在不知道该如何做了,请帮忙
      

  5.   

    cobi(小新国际) 你能不能说的再具体点
      

  6.   

    在<<delphi5程序人员开发指南的347页有个例子就是你的要求了,你看看
      

  7.   

    在<<delphi5程序人员开发指南的347页有个例子就是你的要求了,你看看
      

  8.   

     v_long:=0;
       v_length:=0;
       for i:=v_length to length(s)-1 do
       begin
          v_length:=pos(' ',s);
          v_str:=copy(s,1,v_length);
          v_s:=copy(s,v_length+1,length(s)-v_length);
          s:=v_s;
          showmessage(s);
       end;
      

  9.   

    我不知道循环该如何写 v_long:=0;
       v_length:=0;
       for i:=v_length to length(s)-1 do
       begin
          v_length:=pos(' ',s);
          v_str:=copy(s,1,v_length);
          v_s:=copy(s,v_length+1,length(s)-v_length);
          s:=v_s;
          showmessage(s);
       end;
      

  10.   

    还有我如何知道该TXT文件有多少行啊
      

  11.   

    读入数据的程序如下:
    var
      srcstr,tmpstr,fieldvalue : STring;
      i,j,k : integer;
      l,m : integer;
    begin
      srcstr := '姓名:张学辉 工资号:0001 单位:省局 房租:0.000 水费:54.25 电费:73.44 煤气:0.00 热水:0.000 其他:8.00 合计:135.69 房址:经三路54#北楼303# 收费单位:山东邮电 日期:09/12/2001';
      for I := 0 to  11 do
      begin
        J := length(srcstr);
        K := pos(' ',srcstr);
        tmpstr := copy(srcstr,1,K);
        l := length(tmpstr);
        m := pos(':',tmpstr);
        fieldvalue := copy(tmpstr,m + 2 ,l - m + 1);
        Memo1.Lines.Add(fieldvalue);
        srcstr := copy(srcstr,K + 1,J - K + 1);
      end;    l := length(srcstr);
        m := pos(':',srcstr);
        fieldvalue := copy(srcstr,m + 2,l - m + 1);
        Memo1.Lines.Add(fieldvalue);
    end;其中需要注意的是:
    1.循环要做12次,但是有13个字段,因为最后一个值时已经没有‘  ’了,所以要单独在循环外处理;
    2.你的分隔符‘:’,我不知道你在txt中是中文的冒号还是英文的冒号,前者按程序中所做,后者,则fieldvalue := copy(tmpstr,m + 2 ,l - m + 1);改为
    fieldvalue := copy(tmpstr,m + 1 ,l - m + 1);这是因为中文冒号占两个长度,英文的占一个。
    至于你的文件有多少行,可以在读取文件时读出。如果是text文件,可以使用memo.lines.loadfromfile 取得整个文件内容,而当内部一行为一条记录时,memo.lines.count + 1就是记录的条数。用这中读取方法比较好用
      

  12.   

    再读文本文件时可以用StringList.LoadFromFile(FileName);
      

  13.   

    if Open_file.Execute=true then
       begin
          assignfile(f,open_file.FileName);
          reset(f);
          readln(f,s);
          memo1.Lines.loadfromfile(s);
          closefile(f);
       end;
       showmessage(inttostr(memo1.Lines.count));
       for j:=0 to memo1.Lines.Count-1 do
       begin       for i:=0 to Dbg_Fzx.Columns.Count-1 do
           begin
               v_length:=pos(' ',s);
               v_str:=copy(s,1,v_length);
               v_value:=copy(v_str,pos(':',v_str)+1,length(v_str)-pos(':',v_str));
               if i=0 then
               begin
                   v_bh:=v_value;
               end;
               qry_auto.Close;
               qry_auto.SQL.text:='update  fzx_xxb set '+Dbg_Fzx.Columns[i].FieldName
               +'='''+trim(v_value)+''' where bh='''+v_bh+'''';
               qry_auto.ExecSQL;
               v_s:=copy(s,v_length+1,length(s)-v_length);
               s:=v_s;
           end;   end;
    小新国际你看我这边那有错,怎么我LOADFROMFILE可以,但是showmessage(inttostr(memo1.Lines.count));出错
      

  14.   

    我为你做了一个通用函数,我觉得更方便,更容易维护:function SeperateString(var AList:TStringList;
            AString:AnsiString; ASeprator:string):integer ;
    var
      iLenOfSeprator,iPos:integer;
      strItem:AnsiString;
    begin
      iLenOfSeprator:=Length(ASeprator);
      iPos:=Pos(ASeprator,AString);
      while iPos>0 do
      begin
        strItem:=Copy(AString,1,iPos-1);
        Delete(AString,1,iPos+iLenOfSeprator-1);
        AList.Add(strItem);
        iPos:=Pos(ASeprator,AString);
      end;
      AList.Add(AString);
      Result:=AList.Count ;
    end;
    procedure TForm1.Button3Click(Sender: TObject);
    var
      f:textfile;
      i:integer;
      s:string;
      vList,vSubList:TStringList;
    begin
      if not dlgopen.Execute then Exit;
      vList:=TStringList.Create;
      vSubList:=TStringList.Create;
      AssignFile(f,dlgopen.FileName);
      Reset(f);
      while not eof(f) do
      begin
        Readln(s);
        vList.Clear;
        SeperateString(vList,s,' ');
        Table1.Edit;
        for i:=0 to vList.Count -1 do
        begin
          vSubList.Clear;
          SeperateString(vSubList,vList.Strings[i],':');
          vList.Strings[i]:=vSubList.Strings[1];
        end;
        Table1.FieldByName('姓名').AsString :=vList.Strings[0];
        Table1.FieldByName('工资号').AsString :=vList.Strings[1];
        Table1.FieldByName('单位').AsString :=vList.Strings[2];
        Table1.FieldByName('房租').AsFloat :=StrToFloat(vList.Strings[3]);
        //.......
        //添加所有需要的字段
        Table1.Post;
      end;
      CloseFile(f);
    end;