Using Delphi XE,我需要将 TStringStream 解析为由字符串分隔的字符串。在一种情况下,分隔符字符串将是 [eol]。流是使用 indy IdHttp 从网络服务器加载的。
然后,我需要从 Stream 中解析字符串,它们由字符串"[eol]"分隔。例如,StringStream可以包含:
"12345[eol]这是]某物[EOL]和[这是什么都没有[eol]etc[etcetc[[eol]">
应解析为:
"12345">
"这是]东西">
"[这没什么">
"等等[等等[">
我知道的大多数分隔符技术只使用单个字符分隔符,然后我还需要遍历整个 Stream 直到其结束。我不知所措,
问候艾利安
由于您已经在使用 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;