我需要使用TStringList
作为唯一的'|'
将以下字符串拆分为Delimiter
:
" 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)
您要求的是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;