例:文件如下:
     116   1    1     1      1               0        00000000D0000001
     116   0    3     1      0                               0D0000002
     116   2    1     1     1               0        00000000D0000003
     116,36.30803,25.72891,0.5;                              1P0000001
     116,37.37522,24.1529,1.33078;                           3P0000002
     116,38.36346,22.54986,2.20362;                          5P0000003
我想提取出36.30803  25.72891  0.5
          37.37522,24.1529,1.33078
          38.36346,22.54986,2.20362
应该采用怎么样的方法和思路?

解决方案 »

  1.   

    先查每一行有没有';'号有的话再进行分析.
    如果有的话把字符串以用分号分开的切成两块如:
    第一块:116,36.30803,25.72891,0.5
    第二块:1P0000001
         
    然后把第一块进行分析 
    用','号把字符串分成几块如:
    116
    36.30803 
    25.72891 
    0.5
    好了再把每一个得到的字符串进行解析
    现在进行解析看有没有'.'号有就保存起来!
    OK
    明白。
    我看有没有空.
    帮你写一下代码.
      

  2.   

    var
      aa: TStringlist;
    begin
      aa := Tstringlist.create;
      try
        aa.loadfromfile('你的文件');
        Showmessage(Copy(aa[6], Pos(',', aa[6]) + 1, Pos(';',aa[6]) - 1));
        Showmessage(trim(Copy(aa[6], Pos(';',aa[6]) + 1, MaxInt)));
      finally
        aa.free;
      end;
    end;
      

  3.   

    应是
    var
      aa: TStringlist;
    begin
      aa := Tstringlist.create;
      try
        aa.loadfromfile('你的文件');
        Showmessage(Copy(aa[3], Pos(',', aa[3]) + 1, Pos(';',aa[3]) - 1));
        Showmessage(trim(Copy(aa[3], Pos(';',aa[3]) + 1, MaxInt)));
      finally
        aa.free;
      end;
    end;
      

  4.   

    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;procedure TForm1.Button1Click(Sender: TObject);
    var
      list,list1 : TstringList;
      i,j,index : integer;
      tmp,tmp1 : string;
    begin
      if OpenDialog1.Execute then begin
         List:=TstringList.Create;
         list1:=TstringList.Create;
         List.LoadFromFile(OpenDialog1.FileName);
         For i:=0 to List.Count-1 do begin
           index:=pos(';',list.Strings[i]);
           if index>0 then begin
              tmp:=copy(list.strings[i],1,index-1);
              tmp:=copy(tmp,pos(',',tmp)+1,length(tmp));
              tmp1:='';
              For J:=1 to 3 do//这里的3表示你有几个带小数的数字.明白?
              tmp1:=tmp1+GetStrForSpace(tmp,',',j)+'| ';//这里你可以更改你想要的间断符
             //如把'|'改成'/'也行,其他的也行.自己在测试一下代码吧,我测试过完全没有问题.          List1.add(tmp1);
           End;
         End;
         List1.SaveToFile(OpenDialog1.FileName);
         list.free;
         list1.free;
      End;
    end;哎热死了!!!
      

  5.   

    新建一APPLICATION,在表单上放一按钮控件一listbox控件,将上述文本内容保存到c:\b.txt代码如下:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      s,str:tstringlist; //s:用来将保存文本文件;STR,用来保存取出结果
      s2  :string; //S2,用来保存S中含‘,’列取出的字符串
      icount:integer;
    begin
      s2:='';
      s:=tstringlist.Create;
      str:=tstringlist.Create;
      s.LoadFromFile('c:\b.txt'); //将文本文件取出到S
      for icount:=0 to s.Count-1 do//对文本文件每一行进行取字串;
        begin
        if GetSubStr(s[icount],s2) then
           str.Add(s2); //如果取出,加入到结果集STR
        end;
      for icount:=0 to str.Count-1 do
        begin
          listbox1.Items.Add(str[icount]);//将结果集体读出到列表框;
        end;
    end;取子川函数如下:
    function TForm1.GetSubStr(ss: string;var sa:string):boolean;
    var
      iseof:boolean; //判断字串中是否还存在‘,’,以决定循环是否继续进行
      p1,p2,i:integer;
      tempstr:string;//第一次用来保存第一个逗号和最后分号间字符串,
                   //而后,每取一次,将已取字串截掉
      resultstr:string;//用来保存结果
    begin
      if pos(',',ss)=0  then
      begin
        result:=false;
        exit;
      end;
      resultstr:='';
      result:=true;
      iseof:=true; //初试化变量
      p1:=pos(',',ss);
      p2:=pos(';',ss);
      tempstr:=copy(ss,p1+1,p2-p1+1);// 第一次取出第一个逗号和最后分号间字符串
      while iseof=true do
        begin
          if pos(',',tempstr)=0 then //已无‘,’
            begin
               iseof:=false;
               resultstr:=resultstr+','+tempstr;
            end
          else
             begin
               p1:=pos(',',tempstr);
               IF resultstr='' then
                  resultstr:=copy(tempstr,1,p1-1)
               else
                  resultstr:=resultstr+','+copy(tempstr,1,p1-1);
               tempstr:=copy(tempstr,p1+1,length(tempstr)-p1-1);
             end;
        end;  sa:=resultstr;
    end;可马上测试,该函数再根据你的需求改一改,通用性应很好。
      

  6.   

    单元文件完整代码:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        ListBox1: TListBox;
        procedure Button1Click(Sender: TObject);
        function GetSubStr(ss: string;var sa:string):boolean;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      s,str:tstringlist; //s:用来将保存文本文件;STR,用来保存取出结果
      s2  :string; //S2,用来保存S中含‘,’列取出的字符串
      icount:integer;
    begin
      s2:='';
      s:=tstringlist.Create;
      str:=tstringlist.Create;
      s.LoadFromFile('c:\b.txt'); //将文本文件取出到S
      for icount:=0 to s.Count-1 do//对文本文件每一行进行取字串;
        begin
        if GetSubStr(s[icount],s2) then
           str.Add(s2); //如果取出,加入到结果集STR
        end;
      for icount:=0 to str.Count-1 do
        begin
          listbox1.Items.Add(str[icount]);//将结果集体读出到列表框;
        end;
    end;function TForm1.GetSubStr(ss: string;var sa:string):boolean;
    var
      iseof:boolean; //判断字串中是否还存在‘,’,以决定循环是否继续进行
      p1,p2,i:integer;
      tempstr:string;//第一次用来保存第一个逗号和最后分号间字符串,
                   //而后,每取一次,将已取字串截掉
      resultstr:string;//用来保存结果
    begin
      if pos(',',ss)=0  then
      begin
        result:=false;
        exit;
      end;
      resultstr:='';
      result:=true;
      iseof:=true; //初试化变量
      p1:=pos(',',ss);
      p2:=pos(';',ss);
      tempstr:=copy(ss,p1+1,p2-p1+1);// 第一次取出第一个逗号和最后分号间字符串
      while iseof=true do
        begin
          if pos(',',tempstr)=0 then //已无‘,’
            begin
               iseof:=false;
               resultstr:=resultstr+','+tempstr;
            end
          else
             begin
               p1:=pos(',',tempstr);
               IF resultstr='' then
                  resultstr:=copy(tempstr,1,p1-1)
               else
                  resultstr:=resultstr+','+copy(tempstr,1,p1-1);
               tempstr:=copy(tempstr,p1+1,length(tempstr)-p1-1);
             end;
        end;  sa:=resultstr;
    end;end.
      

  7.   

    上述ltysunde(@ 为要饭而....呐喊 @) 的解决方案是可行的,我已经验证
    wdsimon(老王) 的解决方案基本也没有问题,但是这两种方法都是通过对','和";"的解析而完成的。那么如果每行需要读取字符个数不一样,这样的方法也许会存在问题。
    比如说:112   1    1     1      1               0        00000000D0000001
            112,36.30803,2.2,2.3,2.4,25.72891,1.0,               1P0000001
            0.8.0.4,0.5,37.37522,3.5,3.8,1.3,24.1529,0.4,        3P0000002
            0.9,0.5,1.33078;                                     5P0000003
    要提取为(格式固定):
            36.30803  25.72891  0.5
            37.37522  24.1529   1.33078
    是否应该考虑用开辟内存,也就是动态指针的方法呢?并应考虑将"P"为断句符号。由于该题一共是100分,我先付给ltysunde(@ 为要饭而....呐喊 @) 和wdsimon各25分,略表心意。剩余的讨论后再说!
    再次谢谢你们!