Delphi 7 - 使用严格分隔符拆分字符串而不使用新过程

时间:2016-11-04 08:49:35

标签: string delphi split delphi-7 tstringlist

我需要使用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"

我必须在没有新程序的情况下这样做。

1 个答案:

答案 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;