2016-11-04 2 views
-4

를 사용하지 않고 엄격한 구분과 분할 문자열 :델파이 7 - 나는 유일한 <code>Delimiter</code>로 <code>'|'</code>를 사용하여 <code>TStringList</code>에 다음 문자열을 분할해야 새로운 절차

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

는 그럼으로 ','를 사용하여 각 TStringList 항목을 분할해야 유일한 구분 기호.

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

그런 다음, 두 번째 TStringList에서 이러한 항목을 다음과 같습니다 :

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

나는 새로운 절차없이해야 할

그래서 첫 번째 TStringList에 이러한 항목이 될 것입니다.

+0

이 질문은 많은 시간을 요구하고있다. 웹 서치를 사용해보십시오. –

+3

* "새로운 절차 없이는해야만합니다."* - 어떤 요구 사항입니까? –

답변

2

은 당신은 무엇을 요구하는 것은 DelimitedText 속성 setter에 관계없이 Delimiter 재산의 구분 기호로 공백이 포함의 StrictDelimiter 재산없이 델파이 7에 아직 존재하지 않았다 StrictDelimiter 속성을 필요로하며, 해당 동작을 변경할 수 없습니다. 따라서 대신 입력 문자열을 수동으로 구문 분석해야합니다.

다음 코드는 나중에 델파이 버전에 사용 된 StrictDelimiter 논리에서 파생 된, 그리고 델파이 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; 
관련 문제