在Delphi中,我需要使用子字符串分隔符从TStringStream中解析字符串?

4
使用Delphi XE,我需要将TStringStream解析为由字符串分隔的字符串。 在一个案例中,分隔符字符串将是[eol]。 该流从网络服务器加载,使用indy IdHttp。
然后我需要将字符串从流中解析出来,并且它们被字符串"[eol]"分隔。 例如,StringStream可能包含:
"12345[eol]this is] something[eol]and [this is nothing[eol]etc[etcetc[[eol]"
应该解析为:
"12345"
"this is] something"
"and [this is nothing"
"etc[etcetc["
我知道的大多数分隔技术仅使用单个字符分隔符,而且我还需要迭代整个流直到结束。 我不知所措,
敬礼 Adrian
1个回答

4

由于您已经在使用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;

谢谢Remy,这解决了问题。我也会采纳你的TStringStream建议。 - Adrian Wreyford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接