Удалить неверные данные и разделить xml - PullRequest
0 голосов
/ 28 марта 2012

У меня есть большой xml-файл, который выглядит следующим образом:

        20120124 07:30:15.301, saving to queue 
<logmessage>
    <logline1>some data</logline1>
    <logline2>some data too</logline2>
</logmessage>

    20120124 07:30:15.302, processing message 
<logmessage>
    <logline1>some data</logline1>
    <logline2>some data too</logline2>
</logmessage>

Я хочу разбить его на несколько файлов, каждый из которых содержит одно сообщение журнала, и я не хочу хранить какие-либо данные вне корняузел.Как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 28 марта 2012

Если вы сделаете это, вы захотите использовать синтаксический анализатор на основе SAX.http://en.wikipedia.org/wiki/Simple_API_for_XML Попытка загрузить это в DOM и разделить информацию оттуда будет бесполезной.

0 голосов
/ 28 марта 2012

Обращение за помощью в обработке «большого» XML-файла - это все равно, что сказать, что вам нужна помощь в проектировании моста для пересечения «широкой» реки. Когда я спрашивал людей «какой размер?», У меня были ответы в диапазоне от 10 Мб до 100 Гб. Это имеет значение.

Другая вещь, которая не ясна в вашем вопросе, это то, имеем ли мы дело с правильно сформированным XML. Вы говорите, что это XML, но вы также упоминаете неверные данные. Решение для обработки правильно сформированного XML, вероятно, будет сильно отличаться от обработки данных, которые не являются XML.

0 голосов
/ 28 марта 2012

Будьте осторожны, что вы хотите. Подумайте о последствиях того, что вы делаете. Если это очень большой XML-файл, как вы заявили, это создаст очень большое количество маленьких файлов в вашем каталоге. Это может быть плохо во многих отношениях. Каждый из них будет занимать как минимум наименьший размер блока, который может быть большим в современных массивных файловых системах. Каждый будет использовать inode в linux, который является ограниченным ресурсом, используйте df -i, чтобы определить, достаточно ли у вас доступно Наконец, некоторые файловые системы имеют ограничение или начинают работать плохо, если в одном каталоге создано слишком много файлов.

Далее будет указано, сколько файлов будет создано:

 perl -e '$/="</logmessage>";while(<>) {$i++};print $i,"\n"' log.xml

Следующее создаст новый файл, используя дату и время для имени файла с расширением .xml. Если несколько сообщений имеют одинаковую метку времени, они будут добавлены.

perl -e '$/="</logmessage>";while(<>) {m{([\d:\. ]+)};open(fh,">>","$1.xml");s{^.*?(?=<logmessage>)}{}sm;print fh $_,"\n";close fh}' log.xml

Также помните, что многие библиотеки XML будут пытаться открыть полный файл в памяти, что может быть проблемой для очень большого файла XML. Эта процедура не будет пытаться открыть весь файл в памяти. Если ваш файл слишком велик, чтобы поместиться в памяти, не принимайте решения, использующие синтаксический анализатор XML, который не является SAX или потоковым. Использование анализатора DOM потребует памяти, равной размеру вашего документа, умноженному на накладные расходы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...