Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиПоискОблакоVK ComboВсе проекты

Delphi. Нужно вытащить строки между тегами. Теги имеют разные числа, а также количество самих тегов - разное.

Вячеслав Власов Гуру (3091), закрыт 1 месяц назад
Есть файл с текстом и тегами. Имеем такие варианты строк:

<pxr2=FF6A><psy=FFED><pal=FF><opt=0>НУЖНАЯ СТРОКА<br>
<ini><x0e=12><pxr2=FF2E><psy=FFB5><pal=1>НУЖНАЯ СТРОКА<br>
<pxc=0><psy=5A><pal=1><btn=16>НУЖНАЯ СТРОКА<br>
<pxr2=FF1F><psy=FFD3><pal=0>НУЖНАЯ СТРОКА<pal=1><br>
<ini><pxc=0><psy=FFF6><pal=2>НУЖНАЯ СТРОКА<br>
<pxr2=FF6A><psy=12><pal=FF><opt=0>НУЖНАЯ СТРОКА<br>
<ini><boxa=4><pal=1>НУЖНАЯ СТРОКА<x11=1><end>

А также многострочный вариант:
-----------------------
<ini><x0e=12><pxr2=FF2E><psy=FFB5><pal=1>НУЖНАЯ СТРОКА1<br>
НУЖНАЯ СТРОКА2<br>
НУЖНАЯ СТРОКА3<br>
<br>
НУЖНАЯ СТРОКА4<br>
НУЖНАЯ СТРОКА5<br>
НУЖНАЯ СТРОКА6<br>
<x11=1><end>
------------------------
Нужно прочитать строку, найдя ее по тегу, независимо от его значения, и добавить в Memo.
Многострочные строки (через br) нужно объединить в одну строку, сохранив br-теги внутри нее. После вернуть строки из Memo обратно в файл на свои места, не затронув теги.

Значения тегов (на всякий случай):
pxc - целое число (обычно просто 0)
pxr2 - шестнадцатеричные числа (до 4)
psy - шестнадцатеричные числа (до 4)
pal - шестнадцатеричные числа (до 2)
x0e - шестнадцатеричные числа
btn - целые числа
opt - целые числа
boxa - целые числа
x11 - цифры в теге не меняются, целые числа, содержит значение "1" по всему файлу.
ini - не меняется, не содержит значений
end - не меняется, не содержит значений
br - перенос строки.
Лучший ответ
Свиньи жарят людей Профи (922) 2 месяца назад
ты лучше бы придерживался стандартов, нестандартные файлы усложняют и замедляют парсинг
 var 
strings: TStringList;
i: integer;
str: string;
begin
strings := TStringList.Create;
strings.LoadFromFile('filename.txt', TEncoding.UTF8);
for i := 0 to strings.Count - 1 do
begin
str := strings[i];
while str.Chars[0] = '<' do
delete(str, 1, pos('>', str));
delete(str, pos('<', str), length(str));
strings[i] := str + '
';
end;
Memo1.Lines.Assign(strings);
strings.SaveToFile('filename.txt');
FreeAndNil(strings);
end;
Вячеслав ВласовГуру (3091) 2 месяца назад
Ругается на while str.Chars[0] = '<' do
[DCC Error] Unit1.pas(38): E2018 Record, object or class type required
Свиньи жарят людей Профи (922) Вячеслав Власов, delphi 7? классная прога, но лучше заменить) тебе вместо str.chars[0] нужно писать str[1], и еще нужно убрать TEncoding.UTF8 из strings.LoadFromFile, если будут проблемы с кодировкой, то гугли. и еще, создай копию файла если нету, этот код делает не совсем то что тебе нужно, я просто не врубился куда тебе нужно вернуть, там несколько строчек нужно дописать, по образу и подобию, перед SaveToFile снова загружаешь файл и крутишь циклы, только не с delete, а с copy
Вячеслав ВласовГуру (3091) 2 месяца назад
>я просто не врубился куда тебе нужно вернуть.
Да, уточню: смысл в том, чтобы считать строку из Memo1, вручную изменить ее там, а потом сохранить ее в файл на место между тегами. Грубо говоря:
<pxr2=FF6A><psy=FFED><pal=FF><opt=0>[Считать отсюда]<br>
<pxr2=FF6A><psy=FFED><pal=FF><opt=0>[Вернуть из Memo1 сюда же]<br>.

Хотя, Memo1 - это пока условный черновик. В дальнейшем я думаю использовать ListView для этого, куда будет записываться не только строка, но и номер строки в файле, откуда она была считана, чтобы сохранить ее в файл точно туда.
Свиньи жарят людей Профи (922) Вячеслав Власов, а не проще ли открыть файл в текстовом редакторе, изменить строку и сохранить файл? ты просто хочешь чтобы кто-то за тебя сделал бессмысленную работу, так что давай сам) там делов то на полчаса самое большое. а вообще, человек уже достаточно давно придумал xml/json/yaml, а ты все фигней страдаешь)
Остальные ответы
Jurijus Zaksas Искусственный Интеллект (375461) 2 месяца назад
Современные версии дельфей поддерживают RegExp. Вот тудысь и копай, извини, ничем конкретным помочь не смогу - не спец я в нем и вообще не люблю. Грубо говоря, тебе нужен текст между <*> и <*>.
Сергей Сулимов Просветленный (37801) 2 месяца назад
чуваг, в нотепад++ это решается 1 движением!
Похожие вопросы