怎样读取带分隔符(逗号分隔)的文本文件。例如文本文件的内容是aa,bb,ccc,ddddd,eee,ffff;在程序中可按数组读出:str(1):=aa;str(2):=bb....没有固定宽度。我现在用readln读,每次都是读一行。

解决方案 »

  1.   

    with TStringList.Create do
        begin
            LoadFromFile('E:\book2.txt');
            DelimitedText:= Text;
            Delimiter := ',';
            ShowMessage(Strings[0]);
            Free;
        end;
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    var s,t:TStringList;
    i,j:integer;
    begin
        s:=TStringList.Create;
        t:=TStringList.Create;
        s.LoadFromFile('C:\1.txt');
        for i:=0 to s.Count-1 do
        begin
            t.DelimitedText:=s.Strings[i];
            t.Delimiter:=',';
            for j:=0 to t.Count-1 do
            memo1.Lines.Add(t.Strings[j]);
        end;
        s.Free;
        t.Free;
        ShowMessage('ok');
    end;
      

  3.   

    txt文件:
    aa1,bb1,ccc1,ddddd1,eee1,ffff1;
    aa2,bb2,ccc2,ddddd2,eee2,ffff2;
    aa3,bb3,ccc3,ddddd3,eee3,ffff3;
    aa4,bb4,ccc4,ddddd4,eee4,ffff4;memo内容:
    aa1
    bb1
    ccc1
    ddddd1
    eee1
    ffff1;
    aa2
    bb2
    ccc2
    ddddd2
    eee2
    ffff2;
    aa3
    bb3
    ccc3
    ddddd3
    eee3
    ffff3;
    aa4
    bb4
    ccc4
    ddddd4
    eee4
    ffff4;
      

  4.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
        fFile : Textfile;
        sLine : string;
        sArray : Variant;
        i,j : Integer;
    begin
        AssignFile(fFile,'E:\book2.txt');
        {$I-}
        Reset(fFile);
        {$I+}
        if IOResult=0 then
        begin
            sArray := VarArrayCreate([0,0],varVariant);
            while not Eof(fFile) do
            begin
               Readln(fFile,sLine);
                with TStringList.Create do
                begin
                    DelimitedText:= sLine;
                    Delimiter := ',';
                    for i:=0 to Count-1 do
                    begin
                        j:=VarArrayHighBound(sArray,1);
                        VarArrayRedim(sArray,j+1);
                        sArray[j+1] := Strings[i];
                        ShowMessage(sArray[j+1]);
                    end;
                    Free;
                end;
            end;
        end;
        CloseFile(fFile);
    end;
      

  5.   

    这样也不行啊如果是aa1,bb1,ccc1,ddddd1,eee1,fff f1;
    则aa1,
    bb1,
    ccc1,
    ddddd1,
    eee1,
    fff
    f1;
    他把空格也当分隔符了,我要求逗号之间的数据都存储在一个变量中。
      

  6.   

    用文件读取一行放在str里,然后:
    s:TStringList;
    s:=TStringList.create;
    s.Delimiter := ',';
    s.DelimitedText:=;
    s.DelimitedText:=str;
        for i:=0 to s.Count-1 do
          memo1.lines.add(s[i]);  
        s.Free;
        ShowMessage('ok');
      

  7.   

    用双引号把带空格的隔出来,如果字符串里含有"则需要写成""
    写成这样:
    aa1,bb1,ccc1,ddddd1,eee1,"fff f1;"如果文件格式不是你能控制的,
    就不要用stringlist了,
    自己写个函数,一个字符一个字符的判断
    遍历一个字符串很好写的
      

  8.   

    没有直接可以用的函数吗?vb就有啊,delphi应该也有啊!!!谢谢各位了,能不能在帮忙找找呢,我很懒:)
      

  9.   

    function Compose(str: string; Num: Integer; fgf: string = '|'): string;
    //例子
    //const testStr='//xxxx//yyyy//zzzz';
    //result0 := Compose(testStr,'//',0);{4};{返回用分隔符分成的断数}
    //result1 := Compose(testStr,'//',2);{xxxx};
    //result2 := Compose(testStr,'//',3);{yyyy};
    //result3 := Compose(testStr,'//',4);{zzzz};
    var
      TempI: Integer;
      ResultNum: Integer;
    begin
      ResultNum := 0;
      if Num = 0 then
      begin
        while True do
        begin
          TempI := Pos(fgf, Str);
          if TempI <> 0 then
          begin
            Inc(ResultNum);
            Str := Copy(Str, TempI + Length(fgf), Length(Str));
          end
          else
            Break;
        end;
        Result := IntToStr(ResultNum + 1);
      end
      else
      begin
        for TempI := 2 to Num do
        begin
          ResultNum := Pos(fgf, str {Result});
          if ResultNum = 0 then
            str := ''
          else
            str := Copy(str, ResultNum + Length(fgf), Length(str));
        end;
        Result := Str;
        ResultNum := Pos(fgf, str);
        if ResultNum <> 0 then
          Result := Copy(str, 1, ResultNum - 1);
      end;
    end;每读取一行赋给tempstr
    就用strtoint(compose(tempstr,0,',')) 就是数目
    AssignFile(f,'你的文件全路名');
     ReSet(f);
     While Not Eof(F) do Begin
     begin
      ReadLn(F,S);   //S就是每行数据
      i:=1;
      while i<strtoint(compose(S,0,','))+1 do
      begin
      tstr:=compose(S,i,',');//i=1时就等于'aa1',i=2时就等于'bb1'
        if i=strtoint(compose(S,0,',')) then
        begin
          tstr:=copy(tstr,0,length(tstr)-1); //去除最后那个';'
        end;
       memo1.lines.add(tstr);
      inc(i);
      end;
     end;
     End;
     CloseFile(F);