有一个字符串如下:
2#66|2001/06/21|2001/07/20|5510|510#507|2001/07/21|2001/08/20|5266|166其中前面的2是有几个分组,后面是具体的组,组的格式为:
#ID|开始日期|结束日期|金额|罚金
说明:每项用’|’分割可能有多个组各个组用“#”分开
大虾们能不能用比较好的算法把每一个组每个项分开,请就上面的例子写成详细的代码,最好别用省略号,越详细分越高!

解决方案 »

  1.   

    I'M SORRY FOR WHAT I SAID: LAZY.
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Memo1: TMemo;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure GetItems(s : string;divc : char;ts : tstringlist);
    var
    p : integer;
    begin
    s := s + divc;
    repeat
       p := pos(divc,s);
       if p > 0 then begin
          ts.Add(copy(s,1,p-1));
          s := copy(s,p+1,length(s)-p);
       end;
    until(p =0);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
    ts1,ts2 : tstringlist;
    s : string;
    i : integer;
    begin
    ts1 := tstringlist.create;
    ts2 := tstringlist.create;
    i := pos('#',Edit1.Text);
    s := copy(Edit1.Text,i+1,length(Edit1.Text)-i);
    getitems(s,'#',ts1);
    for i := 0 to ts1.Count -1 do begin
       ts2.Clear;
       getItems(ts1[i],'|',ts2);
       Memo1.lines.Add(ts2.text);
    end;
    ts1.Clear;
    ts2.Clear;
    end;
    end.
      

  3.   

    小可说的是大实话,不过我觉得我的算法还是比较好的.再补充一下,每个大项的值可以从ts1中得到,每个小项的值可以从ts2中得到.
      

  4.   

    调试通过:var s:string;
     group,itm:Tstringlist;
     p,i:integer;
    begin
       s:='2#66|2001/06/21|2001/07/20|5510|510#507|2001/07/21|2001/08/20|5266|166' ;
       p:=  pos('#',s);
       s:=copy(s,p+1,length(s)-p);
       group:=tstringlist.Create;
       itm:=tstringlist.Create;
       group.Delimiter:='#';
       group.DelimitedText:=s;
       itm.Delimiter:='|';
       for p:=0 to group.Count-1 do
       begin
        itm.DelimitedText:=group.Strings[p];
           for i:=0 to itm.Count-1  do
           begin
           showmessage('第'+inttostr(p+1)+'组第'+inttostr(i+1)+'个字符为'+itm.Strings[i]);
           end;
       end;
    end;
      

  5.   

    说明一下:思路跟楼上的差不多,但利用Tstringlist类的Delimiter属性,从而省去了调用拆分的函数.
      

  6.   

    : csouth(金子) 好好好!
      

  7.   

    给你找一个分割字符串的函数!
    function SplitString(const source,ch:string):tstringlist;vartemp:string;i:integer;beginresult:=tstringlist.Create;temp:=source;i:=pos(ch,source);while i<>0 dobeginresult.Add(copy(temp,0,i-1));delete(temp,1,i);i:=pos(ch,temp);end;result.Add(temp);end;然后调用就可以了!
      

  8.   

    fygzg(伏鹰) ( ) 
    再改点就OK
      

  9.   

    to sunware:
    现在还用D3?为什么不升级呀?
      

  10.   

    DelimitedText, Delimiter
    hehe, I'v got another skill for TStrings!!!Wonderful!