2012-05-16 75 views
3

使用Delphi XE, 我需要將TStringStream解析爲由字符串分隔的字符串。 在一種情況下,定界符字符串是[eol]。 流使用indy IdHttp從Web服務器加載。我需要在Delphi中使用子字符串分隔符來解析TStringStream中的字符串嗎?

然後,我需要解析出流中的字符串,並用字符串「[eol]」分隔它們。 作爲一個例子,字符串流可能包含:

「12345 [EOL]這是]東西[EOL]和[這是什麼[EOL]等[etcetc [EOL]」

應解析爲:

「12345」

「這是]東西」

「和[這是什麼」

「等[etcetc [」

我所知道的大多數分隔符技術只使用單個字符分隔符,然後我還需要遍歷整個Stream直到其結束。 我不知所措,

問候 阿德里安

回答

4

既然你已經使用了印,你可以使用它SplitColumnsNoTrim()功能使用的分隔符字符串可以包含在它的多個字符分割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; 

雖然,我不會建議使用TStringStream這種解析。 D2009 +中的TStringStream需要您在其構造函數中指定一個TEncoding(或者讓它默認爲OS默認的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; 
+0

THX雷米,該訣竅。我也會接受TStringStream的建議。 –

相關問題