4

Delphi XE を使用して、TStringStream を解析して、文字列で区切られた文字列にする必要があります。ある場合の区切り文字列は [eol] です。ストリームは、indy IdHttp を使用して Web サーバーから読み込まれます。

次に、ストリームから文字列を解析する必要があり、それらは文字列 "[eol]" で区切られています。例として、StringStream には以下を含めることができます。

「12345[eol]これは]何か[eol]そして[これは何もない[eol]etc[etc[[eol]]」

次のように解析する必要があります。

「12345」

「これは]何かです」

「そして[これは何でもない」

「等[等等[」

私が知っている区切り記号の手法のほとんどは、1 文字の区切り記号のみを使用しており、ストリーム全体を最後まで反復処理する必要があります。私は途方に暮れています、

よろしくエイドリアン

4

1 に答える 1

4

既に Indy を使用しているため、そのSplitColumnsNoTrim()関数を使用して、複数の文字を含むことができる区切り文字 String を使用してStringaを a に分割できます。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ただし、この種の解析に a を使用することはお勧めしません。TStringStreamD2009+ では、コンストラクターで を指定する必要があります(TEncodingまたは、OS の既定の Ansi エンコーディングにデフォルト設定します) 。データが常に ASCII でない限り、事前にデータの文字セットを知ることはできません。 ダウンロードしたデータをデータの実際の文字セットを使用してデコードするロジックがあるため、代わりにその機能を利用する必要があります。TIdHTTPTStringStreamTIdHTTPString

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 に答える