Показать полную графическую версию : [решено] Logparser выбор и сравнение полей из xml файлов
gremlintv2
22-08-2016, 23:52
Вроде как немного волоку в sql запросах, но немного погуглив и почитав примеры работы с Logparseroм, решил не экспериментировать, а спросить знающих людей итак тз:
Есть xml файлы, внутри кракозябры и поля типа <FILENAME>,<SOFTWARE> ,<DOCTYPE> и мн.др.
Мне нужно, чтобы Logparser выбрал значения этих полей, с привязкой к названию файла, например:
<FILENAME>file1</FILENAME>
<SOFTWARE>soft1</SOFTWARE>
<DOCTYPE>type1</DOCTYPE>
<FILENAME>file2</FILENAME>
<DOCTYPE>type2</DOCTYPE>
FILE FILENAME SOFTWARE DOCTYPE
1___file1_____soft1_____ type1
2___file2______________type2
Пробовал выбирать ставя тип лога "XMLLOG" - выдает ошибку(не в конкретном примере, а с моими xml файлами): "В текстовом комментарии обнаружен недопустимый знак"
Пробовал выбирать ставя тип лога "TEXTLINELOG" :
SELECT Text FROM 'C:\\222\*.xml' where Text like '%FILENAME%' тут все отлично выбирает, но как теперь выбрать несколько разных полей, если на такие конструкции:
select filename.*, soft.* from
(SELECT Filename,Text FROM 'C:\\222\*.xml' where Text like '%FILENAME%') filename ,
(SELECT Filename,Text FROM 'C:\\222\*.xml' where Text like '%SOFT%') soft
where filename.Filename=soft.Filename(+)
выбивает ошибки, в то время как sql навигатор в коммандах подобного вида ничего "странного" не видит...
А еще нужно к названию файла привязаться, как-то SUBSTR по скобках ("<",">") сделать и вывести в csv.
Очень надеюсь, что мою тему увидит и прокомментирует, пользователь с ником "Iska", так как я понял - он с этим парсером на "ты". Пробовал ему в ЛС написать, но там ограничения, видимо от таких назойливых как я. А так как этот парсер с урезаным sql, то при попытке что-то выбрать, возникает ощущение "игры в сапера на повышеной сложности" =).
Просмотрел 2-3 страницы по поиску "Logparser", но ответа или зацепки на свои запросы так и не нашел, на "stackoverflow" и в англоязычных примерах в большинстве встречаются запросы к win'довым журналам и запросы
html-страниц. =(.
gremlintv2, выложите образцы xml-файлов (а не приведённые огрызки), упаковав их в архив.
Пробовал выбирать ставя тип лога "XMLLOG" »
Откуда Вы это взяли — «XMLLOG»?
Input Formats
IIS Log File Input Formats
IISW3C: parses IIS log files in the W3C Extended Log File Format.
IIS: parses IIS log files in the Microsoft IIS Log File Format.
BIN: parses IIS log files in the Centralized Binary Log File Format.
IISODBC: returns database records from the tables logged to by IIS when configured to log in the ODBC Log Format.
HTTPERR: parses HTTP error log files generated by Http.sys.
URLSCAN: parses log files generated by the URLScan IIS filter.
Generic Text File Input Formats
CSV: parses comma-separated values text files.
TSV: parses tab-separated and space-separated values text files.
XML: parses XML text files.
W3C: parses text files in the W3C Extended Log File Format.
NCSA: parses web server log files in the NCSA Common, Combined, and Extended Log File Formats.
TEXTLINE: returns lines from generic text files.
TEXTWORD: returns words from generic text files.
System Information Input Formats
EVT: returns events from the Windows Event Log and from Event Log backup files (.evt files).
FS: returns information on files and directories.
REG: returns information on registry values.
ADS: returns information on Active Directory objects.
Special-purpose Input Formats
NETMON: parses network capture files created by NetMon.
ETW: parses Enterprise Tracing for Windows trace log files and live sessions.
COM: provides an interface to Custom Input Format COM Plugins.
так как я понял - он с этим парсером на "ты". »
Неа :).
Пробовал ему в ЛС написать, но там ограничения, видимо от таких назойливых как я. »
Ограничение там одно — на количество сообщений, которое давно превышено, а Iska второй год никак не соберётся и не разгребёт эти авгиевы конюшни.
gremlintv2
23-08-2016, 09:10
Спасибо что ответили! Прикрепил файлы в топике темы - arxiv.7z. XMLLOG взял из гуя так как думал, что "он сделает все красиво", но увы =(..
gremlintv2, это не xml-файлы, к сожалению. В их начале идут некие бинарные «нашлёпки», как я понимаю, некие «как-бы цифровые подписи». Та же песня в конце файлов.
Что Вам нужно извлекать оттуда и в каком виде получать?
gremlintv2
23-08-2016, 10:26
Извлекать нужно часть названия файла и теги, и получать в виде результата:
KOD___________R11GA_____R11GB_____R60GB
33408606______142167____ 28433_____0
38145836______22414_______________25
PS: поле KOD(оно ключевое) получаем из названия файлов через SUBSTR(Filename,7,8)
С выбором значений, точно затрудняюсь ответить, так как видимо, нужно будет "привлекать к участию" эталонный xml в котором будут все существующие xml-теги, либо каким-то образом вытягивать все уникальные теги и по ним сравнивать все файлы. Если бы удалось вытянуть все теги и сравнить с файлами, несмотря на содержимое тегов, было бы супер(так чтобы результат не основывался на четко указанных полях и парсились все теги).
Знать бы синтаксис и логику работы парсера(к сожалению нет у меня опыта работы с этим инструментом), остальное я постараюсь сам дописать.
PPS: как мне показалось, при задании параметра TEXTLINELOG парсер, воспринимает файлы как одну цельную строку.
Спасибо!
Может быть на PowerShell, подойдет:
dir *.xml | Foreach {"KOD__________R11GA_____R11GB_____R60GB"} {
$t = (gc $_.FullName) -match "R11GA|R11GB|R60GB" -replace '</.+|/.+' | % {"$($_.split(">")[1])"}
"{0}{1}{2}{3}" -f $_.name.substring(6,8).PadRight(13,"_"),$t[0].PadRight(10,"_"),$t[1].PadRight(10,"_"),$t[2]
}
Вывод для данных xml:
KOD__________R11GA_____R11GB_____R60GB
01784705_____982346____196469____0
33445606_____142167____28433_____0
38145836_________________________
Извлекать нужно часть названия файла и теги, и получать в виде результата: »
"C:\Program Files (x86)\Log Parser 2.2\LogParser.exe" "SELECT R11GA, R11GB, R60GB FROM 'C:\Мои проекты\0004\*.xml'" -i:XML -fMode:Tree -rootXPath:/DECLAR/DECLARBODY
PS: поле KOD(оно ключевое) получаем из названия файлов через SUBSTR(Filename,7,8) »
Фокус не удастся — во входном формате XML нет параметра, отвечающего за имя файла, увы.
С выбором значений, точно затрудняюсь ответить, так как видимо, нужно будет "привлекать к участию" эталонный xml в котором будут все существующие xml-теги, либо каким-то образом вытягивать все уникальные теги и по ним сравнивать все файлы. Если бы удалось вытянуть все теги и сравнить с файлами, несмотря на содержимое тегов, было бы супер(так чтобы результат не основывался на четко указанных полях и парсились все теги). »
Объясните, что Вам нужно.
PPS: как мне показалось, при задании параметра TEXTLINELOG парсер, воспринимает файлы как одну цельную строку. »
Нет, как отдельные строки (если Вы не ошиблись с указанием входной кодировки).
Может быть на PowerShell, подойдет: »
Именно так. Я токмо хотел посоветовать его пользовать. Но разбирать-таки надо будет именно как xml, а не текстом.
gremlintv2
23-08-2016, 11:09
К сожалению по Вашему скрипту выбивает ошибку: "В текстовом комментарии обнаружен недопустимый знак." =(
Как я это вижу:
1)из папки с xml файлами выбираются все xml-теги и создается эталонный файл znach.txt с найденными тегами
2) по тегу<TIN>, а он есть во всех файлах, выбираются все значения найденных тегов и подставляются в файл znach.txt.
Разбор, как xml на PowerShell:
dir *.xml | Foreach {"KOD__________R11GA_____R11GB_____R60GB"} {
$text = (Get-Content $_.FullName -Raw) -replace 'xsi:nil="(true|false)"'
$xml = [xml]$text.Substring($text.IndexOf('<?xml'), $text.IndexOf('</DECLAR>') - $text.IndexOf('<?xml') + 9)
$t = $xml.DECLAR.DECLARBODY
"{0}{1}{2}{3}" -f $_.name.substring(6,8).PadRight(13,"_"),$t.R11GA.PadRight(10,"_"),$t.R11GB.PadRight(10,"_"),$t.R60GB
}
Вывод:
KOD__________R11GA_____R11GB_____R60GB
01784705_____982346____196469____0
33445606_____142167____28433_____0
38145836_________________________
К сожалению по Вашему скрипту выбивает ошибку: "В текстовом комментарии обнаружен недопустимый знак." =( »
Я предварительно очистил файлы от «бинарщины» и тем самым привёл их к корректному xml-виду.
Как я это вижу: »
gremlintv2, а я не вижу, поскольку Вы не отвечаете на заданный вопрос. Ей-богу, нет ни малейшего желания выцарапывать из Вас детали по кусочкам и за каждым разом всё переделывать заново.
Kazun, очень хорошо. Осталось таки выяснить у автора весь алгоритм.
gremlintv2
23-08-2016, 11:38
Я предварительно очистил файлы от «бинарщины» и тем самым привёл их к корректному xml-виду
Значить лог-парсеру эта бинарщина не по зубам и нужно прибегать к использованию batников для очистки, как я это понял.
а я не вижу, поскольку Вы не отвечаете на заданный вопрос. Ей-богу, нет ни малейшего желания выцарапывать из Вас детали по кусочкам и за каждым разом всё переделывать заново.
Значит буду пробовать парсить на powershell, предварительно, задав значения всех возможных тегов. Так как лог-парсер для таких манипуляций - как выбор всех уникальных значений тегов в одну строку и подставление значение этих тегов, относительно имен файлов, мало пригоден, как я это понял, на своем хоть и маленьком, но довольно не вдохновляющем опыте при работе с этим инструментом.
Значить лог-парсеру эта бинарщина не по зубам »
Ага.
и нужно прибегать к использованию batников для очистки, как я это понял. »
Нет, пакетному файлу это тоже будет «не по зубам». WSH/PoSH — как, например, это сделано у коллеги Kazun в последнем коде.
Так как лог-парсер для таких манипуляций - как выбор всех уникальных значений тегов в одну строку и подставление значение этих тегов, относительно имен файлов, мало пригоден, как я это понял, на своем хоть и маленьком, но довольно не вдохновляющем опыте при работе с этим инструментом. »
Вполне пригоден, только не из командной строки, а посредством Automation на тех же WSH/PoSH, что позволяет предварительно получать из мешанины внутри файла корректный xml и работать уже с ним.
Вы таки расскажете про конечный результат, про глобальную Вашу цель этих манипуляций, а?
gremlintv2
23-08-2016, 11:54
Вы таки расскажете про конечный результат, про глобальную Вашу цель этих манипуляций, а?
Ну скажем так: уж точно не замена хостов, и не написание вирусов))).
Все вполне легально, и файлы эти я тащу из открытого доступа,а не со взломанных аккаунтов.
Просто работа у меня такая - что иногда приходиться искать обходные пути и делать все, пардон, "через одно место".
gremlintv2
23-08-2016, 14:28
Разбор, как xml на PowerShell:
Большое спасибо работает!
А не подскажете новичку, каким образом вместо .PadLeft(10,";") можно просто добавить один символ справа ";" (если количество символов в строке динамическое)?
PS (STA) > "{0};{1};{2};{3}" -f "a","b","c","d"
a;b;c;d
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.