假设我的存储了这么一组数据
"00052","艾敬","Singer\","9"
"00068","才旦卓玛","Singer\","5"
"00059","白雪","Singer\","9"
"00097","陈红","Singer\","1"
"00106","陈琳","Singer\","8"
"00110","陈明","Singer\","9"
"00136","成方圆","Singer\","7"
"00143","崔萍","Singer\","5"
"00169","范春梅","Singer\","9"
"00187","甘萍","Singer\","7"
"00222","杭天琪","Singer\","9"
"00228","何静","Singer\","78"
"00284","江珊","Singer\","77"
"00295","金海心","Singer\","49"
"00325","李丹阳","Singer\","4"
"00326","李谷一","Singer\","0"
"00339","李娜","Singer\","1","4"
"00340","李琼","Singer\","1"
"00375","林萍","Singer\","1"
"00389","刘春梅","Singer\","1"
"00403","刘媛媛","Singer\","9"
"00409","陆萍","Singer\","8
"00433","毛阿敏","Singer\","8"
"00446","那英","Singer\","84
"00491","斯琴格日乐","Singer\","88"
"00492","宋祖英","Singer\","7
"00502","孙悦","Singer\","57
"00509","汤灿","Singer\","7"
"00519","田震","Singer\","4"
"00521","童欣","Singer\","6"
"00525","娃娃","Singer\","6"
"00552","韦唯","Singer\","9"
"00570","吴琼","Singer\","66"
"00704","张也","Singer\","87"
"00718","赵薇","Singer\","13"
"00739","周冰倩","Singer\","9"
"00753","周璇","Singer\","9"
"00770","祖海","Singer\","9"现在我想把最右边分隔符(,)的右边的整型数据排序,请问哪位高手知道吗,小弟真的很急,解决马上给分!

解决方案 »

  1.   

    好好利用TStringList当中的Object
    使用AddObject
    例:
    --------------------------
    var
       tls:TStringList;
       i:integer;
    begin
       tls:=TStringList.Create;
       try
          tls.AddObject('"9"',TObject(PChar('"00052","艾敬","Singer\","9"')));
          tls.AddObject('"5"',TObject(PChar('"00068","才旦卓玛","Singer\","5"')));
          tls.AddObject('"9"',TObject(PChar('"00059","白雪","Singer\","9"')));
          tls.AddObject('"1"',TObject(PChar('"00097","陈红","Singer\","1"')));
          tls.AddObject('"8"',TObject(PChar('"00106","陈琳","Singer\","8"')));
          ....
          tls.Sort;
          for i:=0 to tls.Count-1 do
          ShowMessage(PChar(tls.Objects[i]));
       finally
          tls.Free;
       end;
    end;
    -------------------------
    具体的代码自己写.
      

  2.   

    unsigned 兄弟:
       能不能由大到小排序呀?
      

  3.   

    如果我要把这部分取出来,如何处理:'"00052","艾敬","Singer\","9"'
      

  4.   

    var
      itm:TStringList;
      getStr:string;
    begin
       itm:=TStringList.Create;
       itm.Delimiter:=',';//你的分隔符
       itm.DelimitedText:='"00052","艾敬","Singer\","9"';
       getStr:=itm.strings[2];//如要取"00052"则此处为0,以此类推。
    end;
      

  5.   

    怎么不能编辑回复的帖子?var
      itm:TStringList;
      getStr1,getStr2,getStr3,getStr4:string;
    begin
       itm:=TStringList.Create;
       itm.Delimiter:=',';//你的分隔符
       itm.DelimitedText:='"00052","艾敬","Singer\","9"';
       getStr1:=itm.strings[0];//取得第一个字段值"00052"
       getStr2:=itm.strings[1];//取得第二个字段值"艾敬"
       getStr3:=itm.strings[2];//取得第三个字段值"Singer\"
       getStr4:=itm.strings[3];//取得第四个字段值"9"
       然后通过insert语句写入数据表
       全部记录写完后,可以select * from 表 order by 第四个字段 desc 实现从大到小排序。
    end;
      

  6.   

    samcrm(镜花水月)你好。
    其实我的这种排序的原因就是因为我的数据全部一次性读到内存中了(有两个表,分别放在不同的Tstringlist中),我现在可以把需要的数据检索到一个TStringlist中,但发现需要对 
    '"00052","艾敬","Singer\","9"'
    的最后一列即:"9"进行由大到小排序,烦请您多指教!
      

  7.   

    按要求的格式写一个自己的对比函数然后调用TStringList.CustomSort排序. 剩下的工作就是在对比函数中怎么比较传进来的两个字符串的大小了. 想要第一个字符串在最终结果中排在第二个字符串前面那么就返回一个<0的任意整数, 想排在后面就返回一个>0的任意整数, 如果两个字符串一样无所谓前后的就返回0.所以所谓从小到大还是从大到小还是某些变态的排法都不成问题了.
      

  8.   

    1楼的已经给出答案了,把字符串存入object里,text里只保留你要排序的部分。
    从大到小排列?你读取的时候从tstringlist的最后一个读起,不就好了。
      

  9.   

    unsigned 兄弟:
       能不能由大到小排序呀?
    ==========================
    function DStringListCompareStrings(List: TStringList; Index1, Index2: Integer): Integer;
    begin
      if List.CaseSensitive then
        Result := AnsiCompareStr(List.Strings[Index2], List.Strings[Index1])
      else
        Result := AnsiCompareText(List.Strings[Index2], List.Strings[Index1]);
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
       tls:TStringList;
       i:integer;
    begin
       tls:=TStringList.Create;
       try
          tls.AddObject('"9"',TObject(PChar('"00052","艾敬","Singer\","9"')));
          tls.AddObject('"5"',TObject(PChar('"00068","才旦卓玛","Singer\","5"')));
          tls.AddObject('"9"',TObject(PChar('"00059","白雪","Singer\","9"')));
          tls.AddObject('"1"',TObject(PChar('"00097","陈红","Singer\","1"')));
          tls.AddObject('"8"',TObject(PChar('"00106","陈琳","Singer\","8"')));
          //....
          tls.CustomSort(DStringListCompareStrings);
          for i:=0 to tls.Count-1 do
          ShowMessage(PChar(tls.Objects[i]));
       finally
          tls.Free;
       end;
    end;
      

  10.   

    unsigned 兄弟,排序后怎么会出现下面的情况:"00163","动感男孩","Singer\","5"l
    "00768","卓依婷","Singer\","20"
    "00122","陈小春","Singer\","?
    "00156","邓丽君","Singer\","<
    "00098","陈慧琳","Singer\","?
    "00768","卓依婷","Singer\","20"
    "00768","卓依婷","Singer\","20"
    "00768","卓依婷","Singer\","20"
    "00768","卓依婷","Singer\","20"
    "00768","卓依婷","Singer\","20"
    "00666","袁凤瑛","Singer\","?
    "00017","F4","Singer\","(
    "00034","S.H.E","Singer\","4<
    "00768","卓依婷","Singer\","20"
    "00437","梅艳芳","Singer\","?
    "00561","巫启贤","Singer\","<
    "00768","卓依婷","Singer\","20"
    "00768","卓依婷","Singer\","20"
    "00392","刘欢","Singer\","4"<
    "00475","任贤齐","Singer\","<
    "00536","王力宏","Singer\","?
    "00530","王菲","Singer\","4"<
    "00768","卓依婷","Singer\","20"
    "00495","苏芮","Singer\","4"<
    "00503","邰正宵","Singer\","<
    "00615","许志安","Singer\","?
      

  11.   

    唉,调试了一个晚上还是不知道什么原因
    unsigned(僵哥(当程序语言成为普及的第三语言之后……)) 给的方法当数据一多的时候就会出现特殊字符,你可以用下面的数据测试下 :
    Memo1.Lines.text :如下
    "00052","艾敬","Singer\","9"
    "00053","艾静","Singer\","20"
    "00059","白雪","Singer\","9"
    "00068","才旦卓玛","Singer\","5"
    "00097","陈红","Singer\","1"
    "00106","陈琳","Singer\","8"
    "00110","陈明","Singer\","9"
    "00136","成方圆","Singer\","7"
    "00143","崔萍","Singer\","5"
    "00169","范春梅","Singer\","9"
    "00187","甘萍","Singer\","7"
    "00222","杭天琪","Singer\","9"
    "00228","何静","Singer\","78"
    "00284","江珊","Singer\","77"
    "00295","金海心","Singer\","49"
    "00325","李丹阳","Singer\","4"
    "00326","李谷一","Singer\","0"
    "00339","李娜","Singer\","1"
    "00340","李琼","Singer\","1"
    "00375","林萍","Singer\","1"
    "00389","刘春梅","Singer\","1"
    "00403","刘媛媛","Singer\","9"
    "00409","陆萍","Singer\","8"
    "00433","毛阿敏","Singer\","8"
    "00446","那英","Singer\","84"
    "00491","斯琴格日乐","Singer\","88"
    "00492","宋祖英","Singer\","7"
    "00502","孙悦","Singer\","57
    "00509","汤灿","Singer\","7"
    "00519","田震","Singer\","4"
    "00521","童欣","Singer\","6"
    "00525","娃娃","Singer\","6"
    "00552","韦唯","Singer\","9"
    "00570","吴琼","Singer\","66"
    "00704","张也","Singer\","87"
    "00718","赵薇","Singer\","13"
    "00739","周冰倩","Singer\","9"
    "00753","周璇","Singer\","9"
    "00770","祖海","Singer\","9"
    var
      i : integer;
      ss : string;
    begin
      for i := 0 to Memo1.Lines.Count -1 do
      begin
        ss := '"'+IntToStr(Random(200))+'"';
        SubGx.AddObject(ss,TObject(PChar(Memo1.Lines.Strings[i])));
        ShowMessage(PChar(SubGx.Objects[i]));
      end;
    end;
    烦请您看下,我头都大了,怎么部分记录就会出现多个字符或者少个"或者其他的什么字符的啦!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      

  12.   

    其实AddObject也没必要一定就是把字符串加进去,可以只加入该字符串在Memo当中的行号,就可以排序,然后再似StringList的顺序输出就OK了。
      

  13.   

    function GetNumber(const Source:String):String;
    var
    i:integer;
    begin
       i:=Length(Source);
       while Source[i]<>',' do dec(i);
       Result:=Copy(Source,i+2,Length(Source)-i-2);
    end;
    function DStringListCompareStrings(List: TStringList; Index1, Index2: Integer): Integer;
    begin
       Result:=StrToInt(List.Strings[Index2])-StrToInt(List.Strings[Index1]) ;
       if Result<0 then Result:=-1;
       if Result>0 then Result:=1;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i : integer;
      ss : string;
      SubGx:TStringList;
    begin
      SubGx:=TStringList.Create;
      for i := 0 to Memo1.Lines.Count -1 do
      begin
        ss := GetNumber(Memo1.Lines.Strings[i]);
        SubGx.AddObject(ss,TObject(i));
      end;
      SubGx.CaseSensitive:=true;
      SubGx.CustomSort(DStringListCompareStrings);
      for i:=0 to SubGx.Count-1 do
      begin
        Memo2.Lines.Add(Memo1.Lines.Strings[Integer(SubGx.Objects[i])]);  end;
      SubGx.Free;
    end;
      

  14.   

    终于OK了,谢谢unsigned的支持!接分!