Показать полную графическую версию : [решено] вывод строки из *.xml
LAKERS824
28-06-2012, 16:46
Добрый день!
Есть папка, в которую закачиваются файлы с ftp несколько раз в день.
Названия файлов типа:3143719278_1605201290029.xml
Необходимо прочитать все файлы в папке, и вывести из каждого файла то, что содержится в строке
<InsuranceNumber>94595</InsuranceNumber> , т.е. в этом случае вывести 94595.
Причем итоговое значение д.б. таким : первая часть имени файла остается той же, т.е. 3143719278, а через _ добавляем 94595.
Получаем на выходе: 3143719278_94595
Если же поле InsuranceNumber пустое, то вывести 3143719278_0.
Каким образом это можно сделать или вообще можно?
Anonymоus
28-06-2012, 17:05
Для работы скрипта нужен Grep (http://gnuwin32.sourceforge.net/packages/grep.htm) из набора утилит GNU coreutils, портированный под Windows, плюс его зависимости. Рядом со скриптом создать директорию bin, куда и сложить бинарник грепа и либы, нужные для его работы.
@Echo Off
SetLocal EnableDelayedExpansion
Set Path=%Path%;%CD%\bin
Set XMLPath=D:\Temp\xmlfiles
For /F "delims=" %%F In ('Dir "%XMLPath%\*.xml" /B 2^>nul') Do (
Set Prefix=&Set InsuranceNumber=0
For /F "delims=_" %%P In ("%%~F") Do (Set Prefix=%%P)
For /F "tokens=2 delims=><" %%N In ('grep -Eo "<InsuranceNumber>[^<]*</InsuranceNumber>" "%XMLPath%\%%F"') Do (
If Not %%N==/InsuranceNumber Set InsuranceNumber=%%N
)
Echo !Prefix!_!InsuranceNumber!
)
Pause
Скрипт вместе с обвязкой (греп+зависимости) - http://rghost.ru/38920583
Исправил скрипт, вначале невнимательно прочел условие и не сделал обработку пустого значения.
LAKERS824
28-06-2012, 17:15
Anonymоus, спасибо, заработало, НО:
Если поле InsuranceNumber содержит русские буквы, то получаем в итоге крякозябры, можно ли их исправить?
Anonymоus
28-06-2012, 17:22
LAKERS824, об этом в вашем условии ни слова не было, предполагалось, что InsurcanceNumber состоит из цифр, судя по примеру. Смотрите, в какой кодировке ваши XML, и в какой кодировке сохранён скрипт. Он выводит только то, что получает из файла. Пусть даже в консоли выводятся кракозябры, если перенаправить их в файл - получится читаемый текст в той самой кодировке, в которой были XML-файлы.
LAKERS824
29-06-2012, 08:48
Anonymоus, а как это закинуть в файл? у меня только первая строка в файл уходит.
LAKERS824
05-07-2012, 16:48
Anonymоus, Еще такой момент, после знака _ м.б. различное кол-во символов (точка, 0, начинается с буквы, оканчивается буквой, более 5 символов, 5 символов.).
Так вот, можно ли сделать так, чтобы там где '_98765' (5 символов после _) или '_987654' (6 символов после _) - записывались в один файл, а все остальное переправлять в другой файл?
Anonymоus
05-07-2012, 17:25
LAKERS824, перенаправляется в файл - вот так:
Echo !Prefix!_!InsuranceNumber!>>"file.txt"
Вариант с выводом в два файла, в зависимости от длины строки после "_" :
@Echo Off
SetLocal EnableDelayedExpansion
Set Path=%Path%;%CD%\bin
Set XMLPath=D:\Temp\xmlfiles
For /F "delims=" %%F In ('Dir "%XMLPath%\*.xml" /B 2^>nul') Do (
Set Prefix=&Set InsuranceNumber=0
For /F "tokens=1,2 delims=_." %%P In ("%%~F") Do (Set Prefix=%%P&Set Suffix=%%Q)
For /F "tokens=2 delims=><" %%N In ('grep -Eo "<InsuranceNumber>[^<]*</InsuranceNumber>" "%XMLPath%\%%F"') Do (
If Not %%N==/InsuranceNumber Set InsuranceNumber=%%N
)
Call :StringLen "!Suffix!"
If !$StringLen!==5 (Echo !Prefix!_!InsuranceNumber!>>"result5and6.txt")
If !$StringLen!==6 (Echo !Prefix!_!InsuranceNumber!>>"result5and6.txt")
If Not !$StringLen!==5 (
If Not !$StringLen!==6 (
Echo !Prefix!_!InsuranceNumber!>>"result_other.txt"
)
)
)
Pause&Exit
:StringLen
:: Автор функции - amel27, http://forum.oszone.net/post-1162296-2.html
Set $StringLen=0&Set $StringBuf=%~1
If ""=="%~1" GoTo :EOF
:StringLenLoop
Set /A $StringLen+=1
Call Set $StringChr=%%$StringBuf:~%$StringLen%%%
If ""=="%$StringChr%" GOTO :EOF
GoTo :StringLenLoop
Точки в части после "_" быть не должно.
LAKERS824
06-07-2012, 08:49
3 вопросика:
1 Почему не должно быть точки? Если она все же есть, то в какой из файлов она уйдет? в result_other.txt?
2 Работает наполовину, файла result5and6.txt так и не создается - не нашел после выполнения команды данного файла.
3 И так где 5 знаков тоже вываливаются в result_other.txt
Anonymоus
06-07-2012, 12:19
Точки не должно быть, потому что она используется как разделитель в delims, чтобы отделить и отбросить ненужное расширение файла.
Работает полностью, я протестировал вот на этом наборе файлов - http://rghost.ru/39065474
LAKERS824
06-07-2012, 13:41
я наверное неправильно выразился.
Надо читать внутренний номер InsuranceNumber и если он 5 или 6, то в один файл, если он точка, ноль или отличается от 5 и 6, то в другой.
Все исправил сам, спасибо.
Anonymоus
06-07-2012, 13:47
Вот, теперь всё предельно чётко, так бы сразу и сформулировали.
@Echo Off
SetLocal EnableDelayedExpansion
Set Path=%Path%;%CD%\bin
Set XMLPath=D:\Temp\xmlfiles
For /F "delims=" %%F In ('Dir "%XMLPath%\*.xml" /B 2^>nul') Do (
Set Prefix=&Set InsuranceNumber=0
For /F "tokens=1,2 delims=_" %%P In ("%%~F") Do (Set Prefix=%%P)
For /F "tokens=2 delims=><" %%N In ('grep -Eo "<InsuranceNumber>[^<]*</InsuranceNumber>" "%XMLPath%\%%F"') Do (
If Not %%N==/InsuranceNumber Set InsuranceNumber=%%N
)
Call :StringLen "!InsuranceNumber!"
If !$StringLen!==5 (Echo !Prefix!_!InsuranceNumber!>>"result_5and6.txt")
If !$StringLen!==6 (Echo !Prefix!_!InsuranceNumber!>>"result_5and6.txt")
If Not !$StringLen!==5 (
If Not !$StringLen!==6 (
Echo !Prefix!_!InsuranceNumber!>>"result_other.txt"
)
)
)
Pause&Exit
:StringLen
:: Автор функции - amel27, http://forum.oszone.net/post-1162296-2.html
Set $StringLen=0&Set $StringBuf=%~1
If ""=="%~1" GoTo :EOF
:StringLenLoop
Set /A $StringLen+=1
Call Set $StringChr=%%$StringBuf:~%$StringLen%%%
If ""=="%$StringChr%" GOTO :EOF
GoTo :StringLenLoop
LAKERS824
06-07-2012, 13:48
Anonymоus, огромнейшее спасибо.
LAKERS824
07-07-2012, 00:30
По-умолчанию текстовый файл сохраняется в UTF формате. Можно ли сохранить его в ANSI?
Anonymоus
07-07-2012, 00:46
LAKERS824, утилита Recode (http://forum.oszone.net/post-1945595-8.html) из пакета unxutils поможет вам.
LAKERS824
07-07-2012, 01:26
recode -f utf8/crlf..cp1251 <D:\pronin\result5and6.txt >>D:\pronin\new_result5and6.txt
выдает пустой файл, но в ANSI, а не результат преобразования.
Anonymоus
07-07-2012, 01:41
LAKERS824, попробуйте вот так:
@Echo Off
SetLocal EnableDelayedExpansion
Set Path=%Path%;%CD%\bin
Set XMLPath=D:\Temp\xmlfiles
For /F "delims=" %%F In ('Dir "%XMLPath%\*.xml" /B 2^>nul') Do (
Set Prefix=&Set InsuranceNumber=0
For /F "tokens=1,2 delims=_" %%P In ("%%~F") Do (Set Prefix=%%P)
For /F "tokens=2 delims=><" %%N In ('grep -Eo "<InsuranceNumber>[^<]*</InsuranceNumber>" "%XMLPath%\%%F"') Do (
If Not %%N==/InsuranceNumber Set InsuranceNumber=%%N
)
Call :StringLen "!InsuranceNumber!"
If !$StringLen!==5 (Echo !Prefix!_!InsuranceNumber!|recode utf8..cp1251/>>"result_5and6.txt")
If !$StringLen!==6 (Echo !Prefix!_!InsuranceNumber!|recode utf8..cp1251/>>"result_5and6.txt")
If Not !$StringLen!==5 (
If Not !$StringLen!==6 (
Echo !Prefix!_!InsuranceNumber!|recode utf8..cp1251/>>"result_other.txt"
)
)
)
Pause&Exit
:StringLen
:: Автор функции - amel27, http://forum.oszone.net/post-1162296-2.html
Set $StringLen=0&Set $StringBuf=%~1
If ""=="%~1" GoTo :EOF
:StringLenLoop
Set /A $StringLen+=1
Call Set $StringChr=%%$StringBuf:~%$StringLen%%%
If ""=="%$StringChr%" GOTO :EOF
GoTo :StringLenLoop
LAKERS824
07-07-2012, 17:00
при этом создается пустой файл result_5and6.txt, в нужной кодировке ANSI, а файл result_other.txt вообще не создается
Anonymоus
07-07-2012, 17:18
LAKERS824, к сожалению, я не телепат, чтобы определить кодировку ваших xml-файлов. Судя по тому, что файлы с результатами создавались в utf-8, я предположил, что xml в такой же кодировке, и вписал пару "utf8..cp1251/" в скрипт. Уточните, в какой именно они кодировке и исправьте её в скрипте самостоятельно - либо приложите несколько заархивированных xml для образца, чтобы я сам исправил.
LAKERS824
07-07-2012, 17:22
вложил один xml
Anonymоus
07-07-2012, 17:45
Тип XML: Конец строки - win (CR+LF), Кодировка - UTF8 без BOM
Файл с результатом, без recode: Конец строки - win (CR+LF), Кодировка - UTF8 без BOM
Файл с результатом, в который всё писалось через recode: Конец строки - win (CR+LF), Кодировка - cp1251
Всё верно, пара кодировок правильная, вот результат обработки вашего xml:
http://rghost.ru/39087817/thumb.png (http://rghost.ru/39087817.view)
Вы точно запускаете мой скрипт без модификаций? Файлы не должны создаваться пустыми, у меня всё работает, и на тестовых файлах, и на вашем xml.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.