源文件格式:
RMB,20030220,2,1,1,2,工行,3602111,转换后格式:(固定宽度,用|分开)
RMB|20030220|2         |1        |1|2|6666           |10000     |报销|                     工资我的做法是:
读文件,
if  读到“,”
计算已读的字段的长度l=?
写入文件,并写入(n-l)个空格,再写“|”,清空l=0
再读文件(此处不能循环)解释:
n为每一段的固定宽度,所以每一次读完后要重新设置n的值,请各位发表一下观点看法,有什么好的建议,
我遇到的问题是:
1、怎么控制读到“,”, ReadLn()函数有办法解决这个问题吗?好象它只能控制读长度,
2、怎么计算l的长度?
3、与ReadLn()对应的写WriteLn怎么控制写?如果不是这两个函数,请问是用什么方式读写,(利用指针怎么搞?)

解决方案 »

  1.   

    用pos()函数找到第一个‘,’截下来,在找第二个,再截....
      

  2.   

    用pos()即可,简单方便,前面读完了后,从字符串中删除前面的,包括逗号,然后再pos(),就可依次得到字符了
      

  3.   

    谢谢各位,pos() 我还没用过,是那个下面的控件里的?还请各位发表一下,
    近期一定结分,谢谢!
      

  4.   

    系统的函数.用pos查找字符'c'在s中的位置,查到果为i 
    i:=pos('c',s) 
      

  5.   

    function Pos(Substr: string; S: string): Integer;
    if Pos(',',String) > 0 then
    begin
      找到','返回','所在的位置
    end;
    函数声明在System单元中
      

  6.   

    用Read()函数,一个一个字节读,每读一个,就判断它是不是','如果是的话,你前面的那些和起来就是一个,遇到中文的话,要用ord函数,判断他是否大于128,是的话,这次读到的只是半个汉字,再读半个才是,写入,也可直接用Write函数,一个一个字节写,l的长度,你只要读了几次,l就是多少。祝你好运!!!文件关联和Readln一样
      

  7.   

    摘录到一个函数,相信对你有帮助:
    Function GetStrForSpace(SourceStr :String ; JGZF:char ; Index:integer):String;
    var
       Pchar1 : pchar;
       i , count : integer;
       cStr : string;
    begin
       Count := 0;
       Pchar1 := pchar(SourceStr);
       cStr := '';
       for i:=0 to length(Pchar1)-1 do begin
          if pchar1[i] = JGZF then
             begin
                Count := Count + 1;
                if Count = Index then begin
                   break;
                end;
             end
          else if Count = Index -1 then cStr := cStr + pchar1[i];
       end;
       Result := cStr;
    end;就是从一个字符串中读取指定的部分,

    GetStrForSpace('abcd|123|aaa','|',1)='abcd'
    GetStrForSpace('abcd|123|aaa','|',2)='123'
    GetStrForSpace('abcd|123|aaa','|',3)='aaa'
      

  8.   

    假如我要用这个函数:GetStrForSpace('abcd|123|aaa','|',1)='abcd'
    我要不要先用readln()先读一行然后定义为“string1”,再用函数
    GetStrForSpace('string1',',',1)='xxxx'??
      

  9.   

    不用readln()读.
    如果你的源文件是一个文本文件,参照我的例程.
    (Form1上只有一个TAdoquery,两个Tbutton(生成数据,退出程序)Unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        ADOQuery1: TADOQuery;
        Button2: TButton;
        procedure Button1Click(Sender: TObject); //生成
        procedure FormCreate(Sender: TObject);
        procedure Button2Click(Sender: TObject); //退出
      private
        { Private declarations }
      public
        FilePath:string;
        ConStr:string;
        { Public declarations }
      end;var
      Form1: TForm1;
    implementation{$R *.dfm}Function GetStr(SourceStr :String ; JGZF:char ; Index:integer):String;
    var
       Pchar1 : pchar;
       i : integer;
       count:integer;
       cStr : string;
    begin
       Count := 0;
       Pchar1 := pchar(SourceStr);
       cStr := '';
       for i:=0 to length(Pchar1)-1 do begin
          if pchar1[i] = JGZF then
             begin
                Count := Count + 1;
                if Count = Index then begin
                   break;
                end;
             end
          else if Count = Index -1 then cStr := cStr + pchar1[i];
       end;
       cStr := trim(cStr);
       if length(cStr)=0 then cStr:=' '; 
       //由于不能写入空字符,此处必须将空字符改成一个空格
       result:=cStr;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      ReadRec:tstringlist;
      i:integer;
    begin
      ReadRec:=TStringList.Create;
      ReadRec.LoadFromFile('d:\BLSearch\03030402.00');
    //读入源文件,必须是文本格式的
      for i:= 0 to ReadRec.Count-1  do
      begin
       AdoQuery1.SQL.text:='insert into inputlist (OldNo,SendDate,RecCode,RecDepNo,'+
                  'RecName,RecAdd,SendName,SendAdd,SendTxt) Values ('+
                 ''''+ GetStr(ReadRec[i],#9,1)+''','+
                 ''''+ '2003-01-01'+''','+
                 ''''+ GetStr(ReadRec[i],#9,3)+''','+
                 ''''+ GetStr(ReadRec[i],#9,4)+''','+
                 ''''+ GetStr(ReadRec[i],#9,5)+''','+
                 ''''+ GetStr(ReadRec[i],#9,6)+''','+
                 ''''+ GetStr(ReadRec[i],#9,8)+''','+
                 ''''+ GetStr(ReadRec[i],#9,9)+''','+
                 ''''+ GetStr(ReadRec[i],#9,11)+''')';
    //OldNo....是MDB中表中的字段名
    //#9是指TAB
       ADOquery1.ExecSQL;
       end;
       ReadRec.Free;
       ADOQuery1.Close;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
    Getdir(0, FilePath);
    Adoquery1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='
                      + FilePath +'\BLdata.mdb;Persist Security Info=False';
    //联接数据库指定为当前目录下的BLdata.mdb
    Adoquery1.Close;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
    close;
    end;end.
      

  10.   

    Delphi 葵花宝典
    在我们日常工作中,常会碰到这样一个难题:一大堆收集好的纯文本格式,比较规整的资料怎样才能将它们分离,转到自己已经建好的数据库中进行管理呢?  例如,有一段人事档案资料archive.txt,内容如下:
      小许男21工程师
      小吴女23助理工程师
      小蔡男22助理工程师
      小牟女22工程师  要将它转入数据库archive.dbf中,archive.dbf结构如下:
      姓名,性别,年龄,职称  怎么办呢?现在通过使用delphi编程,很好地解决了这个难题。Delphi提供了许多功能强大,丰富的字符处理函数和过程,常用的有:
      (1)function Length(S:String):Integer                  //返回串的长度
      (2)function Copy(S:String;Index,Count:Integer):String   //给出一个字符串中串的拷贝
      (3)function Pos(Substr:String;S:String);Integer           //查找子串在字符串中的位置
      (4)Procedure Delete(VarS:String;Index,Count:Integer);  //从一个字符串中去除子串  利用Delphi提供的已有函数和过程基础上编制自己的三个函数,实现了纯文本格式资料转入数据库功能。只要Delphi支持的数据库都可以支持。  archive.txt中每行数据为一个字符串,字符串中每个被分割的数据为一个字段,分割每个字段的字符为分割符,这里是空格,也可以是,、;、#等符号。具体思想是:先将字符串进行调整,然后把串中每个字符同分割符比较,将不是分割符的字符追加到MyStr串中,最后得到
    一个字段的内容。通过一个循环,就可以将一个字符串分成几个字段。  Function Regulate(aString,Sepchar:string):string   //去掉多余的分割符,规范字符串
      Function GetSubStr(varsString:string;SepChar:String):String;  //得到字符串中一个子串,因要改变参数aString的值,所以将它用var定义。
      FunctionGetSubStrNum(aString,SepChar:String):Integer;  //计算一个字符串要被分割成几个字段。
      参数:aString是所需分割的一个字符串,SepChar是分割符。  Function RegulateStr(aString:String;Sepchar:String):String; 
      var
        i,Num:Integer;
        Flag:Boolean;
        MyStr,TempStr:String;
      begin
        Flag:=False;//进行标志,去除多余的分割符
        Num:=Length(aString);//计算aString串的长度
        for i:=1 to Num do
        begin
          TempStr:=Copy(aString,i,1);//取aString串中的一字符
          if TempStr <> SepChar then
          begin
            MyStr:=MyStr+TempStr;
            Flag:=True;
          end
          else
            if(Flag = True)then
            begin
              Mystr:=Mystr+TempSrt;
              Flag:=False;
            end;
        end;
        if  MyStr[Length(MyStr)] <> SepChar then
         MyStr:=MyStr+SepChar;
        RegulateSrt:=MyStr;
      end;  Function GetSubStr(var aString:String,SepChar:Strign):String;
      var
        Mysrt:String;
        StrLen:Integer;
        SepCharPso:Integer;
      begin
        StrLen:=Length(aString);
        SepCharPos:=Pos(SepChar,aString);//计算分割符在子串中的位置
        MyStr:=Copy(aString,1,SepCharPos-1); //将分割符前所有字符放到mystr串中
        Delete(aString,1,SepCharPos);//除去分割符和分割符前的子串
        GetSubStr:=MyStr;//返回一个字段
      end;  FunctionTforml.GetSubStrNum(aString:String;SepChar:String):Integer;
      var
        i:Integer;
        StrLen:Integer;
         Num:Integer;
      begin
        StrLen:=Length(aString);
        Num:=0;
        for i:=1 to StrLen do
          if Copy(aString,i,1) = SepCharthen
            Num:=Num+1;
        GetSubSrtNum:=Num;
      end;  有了上面三个函数,现在介绍一下具体的应用:
      1.首先建立一个窗体Forml,加入一个RichEditl(或Menol),一个按钮Buttonl和一个Tablel,设置Tablel的属性:
      Tablell.DataBase = 'c:\Archivs'
      Tablell.TableName ='Archive.dbf'  2.分别加入以下程序:
      Const Space= ''
      ProcedureTForml.FormCreate(Sender:Tobject);
      begin
        RichRditl.Lines.LoadFromFile('Archive.txt');
      end;  ProcedureTForml.Button1Click(Sender:Tobject);
      var
        i,j:Integer;
         MyLine:String;
      begin
        with Tablel do
        begin
           Open;
            for i:=0 to RichEditl.Lines.Count-1 do
            begin
            MyLine:=RegulateStr(Richeditl.Lines[i],Space);
            for j:=1 to Num do 
            begin
              Append;
              fileds[j-1].aString:=GetSubSrt(MyLine,Space));
              post;
            end;
          end;
        end;
      end;
      

  11.   

    用char型数组来处理比较方便,我刚写完一个类似的函数.