2016-11-04 1 views
-4

мне нужно разделить следующую строку в TStringList используя '|' в качестве единственного Delimiter:Delphi 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 свойство сеттер содержит пробелы как разделители, независимо от Delimiter собственности, и вы не можете изменить это поведение. Таким образом, вам придется вручную анализировать входную строку.

Следующий код является производным от StrictDelimiter логики, используемой в более поздних версиях Delphi, и отлично работает в 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; 
Смежные вопросы