2012-05-16 1 views
3

Использование Delphi XE, Мне нужно разобрать TStringStream в строки, ограниченные строкой. Строка-разделитель в одном случае будет [eol]. Поток загружается с веб-сервера с помощью indy IdHttp.Мне нужно разбирать строки из TStringStream с помощью разделителя подстроки в Delphi?

Затем мне нужно разобрать строки из потока, и они разделены строкой «[eol]». В качестве примера StringStream может содержать:

"12345 [EOL] это] что-то [EOL] и [в этом нет ничего [EOL] и т.д. [etcetc [[EOL]"

следует разобрать на:

"12345"

"это] то, что"

"и [в этом нет ничего"

"и т.д. [etcetc ["

Большинство методов разметки, которые я знаю, используют только одиночные разделители символов, а затем мне также нужно перебирать весь поток до его конца. Я в недоумении,

С уважением Адриан

ответ

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 для такого рода разбора, хотя. TStringStream в D2009 + требует указать в своем конструкторе 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; 
+0

Thx Remy, что сделал трюк. Я также возьму ваш совет с помощью TStringStream. –