【问题标题】:I need to parse strings out of a TStringStream using a substring delimiter in Delphi?我需要在 Delphi 中使用子字符串分隔符从 TStringStream 中解析字符串?
【发布时间】:2012-05-16 20:13:28
【问题描述】:

使用 Delphi XE, 我需要将 TStringStream 解析为由字符串分隔的字符串。 在一种情况下,分隔符字符串是 [eol]。 流是使用 indy IdHttp 从网络服务器加载的。

然后我需要从 Stream 中解析出字符串,并用字符串“[eol]”分隔它们。 例如,StringStream 可能包含:

"12345[eol]this is] something[eol]and [this is nothing[eol]etc[etcetc[[eol]"

应该解析成:

“12345”

“这是]某物”

“而且[这没什么”

“等[等[等[”

我知道的大多数分隔符技术只使用单个字符分隔符,然后我还需要遍历整个 Stream 直到它结束。 我很茫然,

问候 阿德里安

【问题讨论】:

    标签: delphi stream substring delphi-xe stringstream


    【解决方案1】:

    由于您已经在使用 Indy,您可以使用其 SplitColumnsNoTrim() 函数将 String 拆分为 TStrings,其中使用可以包含多个字符的分隔符字符串。顾名思义,SplitColumnsNoTrim() 不会在分隔的子字符串之间应用任何修剪。如果要修剪,请改用SplitColumns()

    var
      Strm: TStringStream;
      Strings: TStringList;
    begin
      Strings := TStringList.Create;
      try
        Strm := TStringStream.Create;
        try
          IdHTTP.Get('http://...', Strm);
          SplitColumnsNoTrim(Strm.DataString, Strings, '[eol]'); 
        finally
          Strm.Free;
        end;
        // use Strings as needed ...
      finally
        Strings.Free;
      end;
    end;
    

    不过,我不建议使用TStringStream 进行这种解析。 D2009+ 中的TStringStream 要求您在其构造函数中指定TEncoding(或让它默认为操作系统默认的Ansi 编码),如果您将TIdHTTP 直接下载到TStringStream 中,则无法执行此操作。您不会提前知道数据的字符集,除非数据始终是 ASCII。 TIdHTTP 具有使用数据的实际字符集将下载的数据解码为 String 的逻辑,因此您应该改用该功能,例如:

    var
      Strings: TStringList;
    begin
      Strings := TStringList.Create;
      try
        SplitColumnsNoTrim(IdHTTP.Get('http://...'), Strings, '[eol]'); 
        // use Strings as needed ...
      finally
        Strings.Free;
      end;
    end;
    

    【讨论】:

    • 谢谢雷米,成功了。我也会接受你对 TStringStream 的建议。
    猜你喜欢
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多