2016-11-04 23 views
-4

我需要使用'|'作为唯一Delimiter分割以下字符串为TStringList德尔福7 - 将字符串分割具有严格的分隔符,而无需使用新的程序

" 0.985,EError can't find,E| 0,5186,Name,6946" 

然后我需要分割使用','每个TStringList项目唯一的`分隔符。

所以,在第一TStringList将这些项目:

" 0.985,EError can't find,E" 
"0,5186,Name,6946" 

然后,在第二TStringList将这些项目:

" 0.985" 
"ERror can't find" 
"E" 

我必须这样做,没有新的程序。

+0

这个问题已经被问了很多次。尝试一个网络搜索。 –

+3

*“我必须在没有新程序的情况下进行。”* - 这是什么要求? –

回答

2

你所要求的需要StrictDelimiter属性,它并没有在Delphi 7尚不存在没有StrictDelimiter特性,DelimitedText属性setter包括空格作为分隔符无论Delimiter财产,你不能改变这种行为。所以,你将不得不手动解析输入字符串。

下面的代码是从后面的Delphi版本中使用的StrictDelimiter逻辑推导,并努力在Delphi 7罚款:

uses 
    SysUtils, Classes, Windows; 

procedure SplitDelimitedText(const Value: string; List: TStrings; StrictDelimiter: Boolean = True); 
var 
    P, P1: PChar; 
    S: string; 
begin 
    if not StrictDelimiter then 
    begin 
    List.DelimitedText := Value; 
    Exit; 
    end; 

    List.BeginUpdate; 
    try 
    List.Clear; 
    P := PChar(Value); 
    while P^ <> #0 do 
    begin 
     if P^ = List.QuoteChar then 
     S := AnsiExtractQuotedStr(P, List.QuoteChar) 
     else 
     begin 
     P1 := P; 
     while (P^ <> #0) and (P^ <> List.Delimiter) do 
      P := CharNext(P); 
     SetString(S, P1, P - P1); 
     end; 
     List.Add(S); 

     if P^ = List.Delimiter then 
     begin 
     P1 := P; 
     if CharNext(P1)^ = #0 then 
      List.Add(''); 
     P := CharNext(P); 
     end; 
    end; 
    finally 
    List.EndUpdate; 
    end; 
end; 

var 
    s: String; 
    sl1, sl2: TStringList; 
    i: Integer; 
begin; 
    s := ' 0.985,EError can''t find,E| 0,5186,Name,6946'; 
    sl1 := TStringList.Create; 
    try 
    sl1.Delimiter := '|'; 
    sl1.QuoteChar := #0; 
    SplitDelimitedText(s, sl1); 

    sl2 := TStringList.Create; 
    try 
     sl2.Delimiter := ','; 
     sl2.QuoteChar := #0; 
     for I := 0 to sl1.Count-1 do 
     begin 
     SplitDelimitedText(sl1[i], sl2); 
     // use sl2 as needed... 
     end; 
    finally 
     sl2.Free; 
    end; 
    finally 
    sl1.Free; 
    end; 
end;