4

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

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

“12345[eol]这是]某事[eol]和[这没什么[eol]etc[etcetc[[eol]”

应该解析为:

“12345”

“这是]东西”

“而且[这没什么”

“等等[等等[”

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

问候阿德里安

4

1 回答 1

4

由于您已经在使用 Indy,您可以使用它的SplitColumnsNoTrim()功能将 a 拆分StringTStrings使用分隔符字符串,其中可以包含多个字符。顾名思义,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;

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

var
  Strings: TStringList;
begin
  Strings := TStringList.Create;
  try
    SplitColumnsNoTrim(IdHTTP.Get('http://...'), Strings, '[eol]'); 
    // use Strings as needed ...
  finally
    Strings.Free;
  end;
end;
于 2012-05-16T20:55:58.517 回答