Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] вывод строки из *.xml

Ответить
Настройки темы
CMD/BAT - [решено] вывод строки из *.xml

Пользователь


Сообщения: 52
Благодарности: 0

Профиль | Отправить PM | Цитировать


Добрый день!

Есть папка, в которую закачиваются файлы с ftp несколько раз в день.
Названия файлов типа:3143719278_1605201290029.xml

Необходимо прочитать все файлы в папке, и вывести из каждого файла то, что содержится в строке

<InsuranceNumber>94595</InsuranceNumber> , т.е. в этом случае вывести 94595.

Причем итоговое значение д.б. таким : первая часть имени файла остается той же, т.е. 3143719278, а через _ добавляем 94595.

Получаем на выходе: 3143719278_94595

Если же поле InsuranceNumber пустое, то вывести 3143719278_0.



Каким образом это можно сделать или вообще можно?

Отправлено: 16:46, 28-06-2012

 

Старожил


Сообщения: 415
Благодарности: 257

Профиль | Отправить PM | Цитировать


Для работы скрипта нужен Grep из набора утилит 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

Исправил скрипт, вначале невнимательно прочел условие и не сделал обработку пустого значения.

Последний раз редактировалось Anonymоus, 28-06-2012 в 17:18.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:05, 28-06-2012 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Пользователь


Сообщения: 52
Благодарности: 0

Профиль | Отправить PM | Цитировать


Anonymоus, спасибо, заработало, НО:

Если поле InsuranceNumber содержит русские буквы, то получаем в итоге крякозябры, можно ли их исправить?

Отправлено: 17:15, 28-06-2012 | #3


Старожил


Сообщения: 415
Благодарности: 257

Профиль | Отправить PM | Цитировать


LAKERS824, об этом в вашем условии ни слова не было, предполагалось, что InsurcanceNumber состоит из цифр, судя по примеру. Смотрите, в какой кодировке ваши XML, и в какой кодировке сохранён скрипт. Он выводит только то, что получает из файла. Пусть даже в консоли выводятся кракозябры, если перенаправить их в файл - получится читаемый текст в той самой кодировке, в которой были XML-файлы.

Отправлено: 17:22, 28-06-2012 | #4


Пользователь


Сообщения: 52
Благодарности: 0

Профиль | Отправить PM | Цитировать


Anonymоus, а как это закинуть в файл? у меня только первая строка в файл уходит.

Последний раз редактировалось LAKERS824, 05-07-2012 в 16:49.


Отправлено: 08:48, 29-06-2012 | #5


Пользователь


Сообщения: 52
Благодарности: 0

Профиль | Отправить PM | Цитировать


Anonymоus, Еще такой момент, после знака _ м.б. различное кол-во символов (точка, 0, начинается с буквы, оканчивается буквой, более 5 символов, 5 символов.).

Так вот, можно ли сделать так, чтобы там где '_98765' (5 символов после _) или '_987654' (6 символов после _) - записывались в один файл, а все остальное переправлять в другой файл?

Отправлено: 16:48, 05-07-2012 | #6


Старожил


Сообщения: 415
Благодарности: 257

Профиль | Отправить PM | Цитировать


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
Точки в части после "_" быть не должно.

Последний раз редактировалось Anonymоus, 05-07-2012 в 17:30.


Отправлено: 17:25, 05-07-2012 | #7


Пользователь


Сообщения: 52
Благодарности: 0

Профиль | Отправить PM | Цитировать


3 вопросика:

1 Почему не должно быть точки? Если она все же есть, то в какой из файлов она уйдет? в result_other.txt?
2 Работает наполовину, файла result5and6.txt так и не создается - не нашел после выполнения команды данного файла.
3 И так где 5 знаков тоже вываливаются в result_other.txt

Отправлено: 08:49, 06-07-2012 | #8


Старожил


Сообщения: 415
Благодарности: 257

Профиль | Отправить PM | Цитировать


Точки не должно быть, потому что она используется как разделитель в delims, чтобы отделить и отбросить ненужное расширение файла.
Работает полностью, я протестировал вот на этом наборе файлов - http://rghost.ru/39065474

Отправлено: 12:19, 06-07-2012 | #9


Пользователь


Сообщения: 52
Благодарности: 0

Профиль | Отправить PM | Цитировать


я наверное неправильно выразился.
Надо читать внутренний номер InsuranceNumber и если он 5 или 6, то в один файл, если он точка, ноль или отличается от 5 и 6, то в другой.
Все исправил сам, спасибо.

Отправлено: 13:41, 06-07-2012 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] вывод строки из *.xml

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Win32 API - Вывод картинок Lev Программирование и базы данных 11 12-02-2010 19:38
MySQL - Автозамена строки из другой строки - trigger? procedure ? BugZZ Программирование и базы данных 0 18-09-2009 09:51
Вывод на печать???? Novistok Microsoft Windows NT/2000/2003 4 08-11-2005 10:52
Вывод на телевизор dascon Программное обеспечение Windows 15 04-09-2004 06:55
постраничный вывод chem1 Вебмастеру 4 16-01-2004 22:46




 
Переход