Запись ( N
Подзапись ( 1
Подзапись ( Значение1 ... ЗначениеK )
)
...
Подзапись ( N
Подзапись ( Значение1 ... ЗначениеK )
)
)
Анализ данных из текстового файла
Вообщем в TStringList'e есть текст из этого файла такого типа:
Код:
Этих "N" может до черта!! "K" тоже довольно много, но это не суть, мне надо получить Запись, Подзаписи и их значения, причем подзаписи могут быть разных типов, от типа зависит количество значений и т.п.
Сначала думал разбирать все построчно, но потом отбросил потому что, если делать построчно то, там со скобками проблема (где начинается Запись, где заканчивается), если смотреть на все это, как на одну большую строку, то тут у меня вообще голова кругом идет! Думал через Pos, Copy и т.п. тоже запоролся, Pos('Подзапись', StringList.Text) даст мне начало первой Подзаписи, а до второй мне уже не добраться, как то обрезать текст, искать дальше чтоли, вообщем у меня туман щас в голове да и опыта маловато (особенно в работе с текстом), может у кого нить есть какие нибудь мысли, помогите пожалуйста!
Тогда и работать с данными надо как с деревом - рекурсивно лучше
Ну что это дерево, я сразу понял,но хотел своими руками все парсить,а оказывается VCL все уже умеет, загрузил файл в TreeView, там все уже готово! Но использование TreeView - не выход...
Цитата: transtream
Но использование TreeView - не выход...
почему это не выход? или ты думаешь что этот парсер напишет кто-нибудь за тебя?
Ну скопипасть код из ComCtrls.TTreeStrings.LoadTreeFromStream и пользуй его :)
Дело то в том, что TreeView загружает этот файл относительно отступов (удалил отступ - на запись выше, добавил - ниже..). Программа, которая пишет этот файл, читает его с отступами точно так же, как и без них (не зря же скобки есть), но это еще бог с ним, число значений в подзаписях может быть довольно большим (свыше 1000), причем значения не всегда целые, вообщем символов там много много, и TreeView в таких случаях выдает ошибку и не может записать все в одну запись...
Тогда точно возьми код TreeView-а за основу!
ну да, тут два варианта, либо писать свои парсер, либо брать за основу TreeView, но надеяться что пользователь не залезет в файл и не собъет всю структуру дерева, попробую с TreeView помучиться, если что обращусь с надеждой на помощь:)
думаю само правильно будет использовать Regex'ы (Регулярные выражения) (если они есть в делфи) ;-)
регулярные выражения в delphi по моему как-то можно использовать, но на сколько мне известно на php они работают медленнее строковых функций, а мне скорость нужна!
Да и потом я эту проблему уже решил - создал тип(как у дерева) и функции, которые потихоньку парсят все это добро и запихивают в переменную этого типа!