Любой язык - [решено] Поиск неизвестной строки в файле, ограниченной известными символами
-
m0nkrus
Любой язык - [решено] Поиск неизвестной строки в файле, ограниченной известными символами
Сразу прошу прощения, если подобный вопрос уже задавался. Я так и не смог достаточно кратко его сформулировать для поиска, чтобы найти аналог.
Задача в следующем: имеется XML-файл, формирующийся автоматом при установке программы. В нем, кроме всего прочего, есть переменная величина, ограниченная тэгами (в моем случае выглядит: "4875E02D9FB21EE389F73B8D1702B320485DF8CE.1"). Какой будет эта величина, окруженная тэгами publisherID и даже сколько символов содержит, неизвестно. Необходимо считать эту строку, какая бы она не была, и передать в переменную. Ах да, еще желательно проверить на наличие самого файла, в котором находится искомая строка.
Задача в следующем: имеется XML-файл, формирующийся автоматом при установке программы. В нем, кроме всего прочего, есть переменная величина, ограниченная тэгами (в моем случае выглядит: "4875E02D9FB21EE389F73B8D1702B320485DF8CE.1"). Какой будет эта величина, окруженная тэгами publisherID и даже сколько символов содержит, неизвестно. Необходимо считать эту строку, какая бы она не была, и передать в переменную. Ах да, еще желательно проверить на наличие самого файла, в котором находится искомая строка.
-
Foreigner
Re: Любой язык - [решено] Поиск неизвестной строки в файле, ограниченной известными символами
Код:
Если ваш xml всегда неизменный по своему форматированию, то можно ограничиться таким вариантов:
Код:
Останется только подобрать нужный токен (2 или 3), выделен красным
Код: Выделить всё
@echo off
setlocal
if not exist 1.xml goto:eof
for /f "tokens=*" %%i in (' findstr "publisherID" 1.xml ') do (
for /f "tokens=2 delims=" %%j in ( "%%i" ) do set "value=%%j"
)
echo %value%Если ваш xml всегда неизменный по своему форматированию, то можно ограничиться таким вариантов:
Код:
Код: Выделить всё
@echo off
setlocal
if not exist 1.xml goto:eof
for /f "tokens=2 delims=" %%i in (' findstr "publisherID" 1.xml ') do set "value=%%i"
echo %value%Останется только подобрать нужный токен (2 или 3), выделен красным
-
amel27
Re: Любой язык - [решено] Поиск неизвестной строки в файле, ограниченной известными символами
на тот случай, если количество тегов в строке несколько:
Код: Выделить всё
@Echo Off
SetLocal EnableDelayedExpansion
Set "$f=.\1.xml"
Set "$t=publisherID"
Set "$v="& If Exist "%$f%" (
For /F "Delims=" %%a In ('^<"%$f%" Find "<%$t%>"^|Find "</%$t>%"') Do (Set "$a=%%a"
Call Set "$t1=%%$a:*<!$t!>=%%"& Call Set "$t2=</!$t!>%%$a:*</!$t!>=%%"& Call Set "$v=%%$t1:!$t2!=%%")
If Not Defined $v echo File "%$f%" Not Contain Tag "<%$t%>" or Tag Empty^^!& GoTo:Continue
) Else Echo File "!$f!" Not Found^^!& GoTo:Continue
Echo %$t%=%$v%
:Continue
Pause>Nul-
Vadikan
Re: Любой язык - [решено] Поиск неизвестной строки в файле, ограниченной известными символами
Коллеги,
Подниму тему, ибо похожая задача. Нужно найти ряд параметров и вывести их значения. Только пара выглядит так:
Код:
Я не знаю, как в CMD в качестве разделителя указать двойные кавычки. Возможно, есть другой подход? В идеале нужно найти все экземпляры param и вывести для них value.
Спасибо!
Подниму тему, ибо похожая задача. Нужно найти ряд параметров и вывести их значения. Только пара выглядит так:
Код:
Код: Выделить всё
param="value"Я не знаю, как в CMD в качестве разделителя указать двойные кавычки. Возможно, есть другой подход? В идеале нужно найти все экземпляры param и вывести для них value.
Спасибо!
-
Iska
Re: Любой язык - [решено] Поиск неизвестной строки в файле, ограниченной известными символами
Цитата Vadikan:
как в CMD в качестве разделителя указать двойные кавычки. Возможно, есть другой подход?
Я вот тоже думаю — а нужно ли?
Что если так — по «=» отбирать строки и по нему же делить:
Код:
Конечно, это при условии, что «=» не встретится где-нибудь внутри «value».
как в CMD в качестве разделителя указать двойные кавычки. Возможно, есть другой подход?
Любой язык - [решено] Поиск неизвестной строки в файле, ограниченной известными символами
Я вот тоже думаю — а нужно ли?
Что если так — по «=» отбирать строки и по нему же делить:
Код:
Код: Выделить всё
@echo off
setlocal enableextensions enabledelayedexpansion
for /f "tokens=1,2 delims==" %%i in ('type "C:\Песочница\0006\0001.txt"^|find.exe "="') do echo [%%~i] [%%~j]
endlocal
exit /b 0Конечно, это при условии, что «=» не встретится где-нибудь внутри «value».
-
Vadikan
Re: Любой язык - [решено] Поиск неизвестной строки в файле, ограниченной известными символами
Я не очень понял, как использовать этот код. Наверное, мне стоило полнее сформулировать задачу 
В файле содержится много различной информации, в том числе XML вытянутый в одну строку. Скажем, там может быть 7-8 тысяч символов в дюжине строк. Пара param="value" фактически является атрибутом XML-узла.
Есть мысли о PowerShell, но не знаю, как он парсит XML, смешанный с другим мусором

В файле содержится много различной информации, в том числе XML вытянутый в одну строку. Скажем, там может быть 7-8 тысяч символов в дюжине строк. Пара param="value" фактически является атрибутом XML-узла.
Есть мысли о PowerShell, но не знаю, как он парсит XML, смешанный с другим мусором

-
Foreigner
Re: Любой язык - [решено] Поиск неизвестной строки в файле, ограниченной известными символами
Цитата Vadikan:
Есть мысли о PowerShell, но не знаю, как он парсит XML, смешанный с другим мусором
Наверное его сначала надо вытянуть в отдельный файл. Если весь xml в отдельной строке в файле your.file:
Код:
А потом парсить temp.xml:
Код:
И его уже обрабатывать.
При условии, что этот xml будет валидным.
Есть мысли о PowerShell, но не знаю, как он парсит XML, смешанный с другим мусором
Любой язык - [решено] Поиск неизвестной строки в файле, ограниченной известными символами
Наверное его сначала надо вытянуть в отдельный файл. Если весь xml в отдельной строке в файле your.file:
Код:
Код: Выделить всё
(gc your.file) -match "\<\?xml" | out-file -encoding utf8 temp.xmlА потом парсить temp.xml:
Код:
Код: Выделить всё
$xml = new-object xml
$xml.load("$pwd\temp.xml")И его уже обрабатывать.
При условии, что этот xml будет валидным.
-
Vadikan
Re: Любой язык - [решено] Поиск неизвестной строки в файле, ограниченной известными символами
Foreigner, спасибо, парсинг XML я проходил, когда делал CheckBootSpeed, а вот первую команду не знал.
Файл на работе (и по тем же причинам я его не публикую), надо посмотреть. ЕМНИП, нужная информация может быть просто во фрагментах XML-кода или в отдельных элементах, просто выдержанных в формате XML.
Файл на работе (и по тем же причинам я его не публикую), надо посмотреть. ЕМНИП, нужная информация может быть просто во фрагментах XML-кода или в отдельных элементах, просто выдержанных в формате XML.
-
Vadikan
Re: Любой язык - [решено] Поиск неизвестной строки в файле, ограниченной известными символами
В итоге пришел именно к парсингу XML средствами PowerShell, задавая не только начало, но и конец диапазона с помощью (.+)
Почему-то в отдельный файл вытягивались данные не с начала диапазона, а с начала строки, на которой он находился. Но это было легко поправить с
parse-xml.ps1
Код:
temp.xml
Код:
tidy-xml.cmd
Код:
tidyconf.txt
Код:
Почему-то в отдельный файл вытягивались данные не с начала диапазона, а с начала строки, на которой он находился. Но это было легко поправить с
HTML Tidy
(тем более, что все равно это было необходимо по другой причине).parse-xml.ps1
Код:
Код: Выделить всё
#вытягиваем данные из файла source-file.txt в temp.xml
#диапазон от '[message' до ''
(gc "source-file.txt") -match "\[message(.+)\" | out-file -encoding utf8 temp.xml
#очищаем XML
cmd /c "C:\mydir\tidy-xml.cmd"
# примерный код temp.xml показан ниже
$xmlFile = "temp.xml"
[xml]$doc = Get-Content $xmlFile
#выводим нужные параметры на экран
write-host Param1: $doc.CUSTOM_XML.Section.Param1
write-host Param2: $doc.CUSTOM_XML.Section.Param2
write-host Param-pam:$doc.CUSTOM_XML.Section.SubSection.Param-pam
write-host Param-pam-pam:$doc.CUSTOM_XML.Section.SubSection.Param-pam-pamtemp.xml
Код:
Код: Выделить всё
tidy-xml.cmd
Код:
Код: Выделить всё
tidy.exe -m -config tidyconf.txt "temp.xml"tidyconf.txt
Код:
Код: Выделить всё
input-xml: y
indent: auto
markup: yes
wrap: 0