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

Компьютерный форум 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 | Цитировать


Вот, теперь всё предельно чётко, так бы сразу и сформулировали.
Код: Выделить весь код
@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
Это сообщение посчитали полезным следующие участники:

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



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

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


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


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

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


Anonymоus, огромнейшее спасибо.

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


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


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

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


По-умолчанию текстовый файл сохраняется в UTF формате. Можно ли сохранить его в ANSI?

Отправлено: 00:30, 07-07-2012 | #13


Старожил


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

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


LAKERS824, утилита Recode из пакета unxutils поможет вам.

Отправлено: 00:46, 07-07-2012 | #14


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


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

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


Код: Выделить весь код
recode -f utf8/crlf..cp1251 <D:\pronin\result5and6.txt >>D:\pronin\new_result5and6.txt
выдает пустой файл, но в ANSI, а не результат преобразования.

Отправлено: 01:26, 07-07-2012 | #15


Старожил


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

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


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

Отправлено: 01:41, 07-07-2012 | #16


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


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

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


при этом создается пустой файл result_5and6.txt, в нужной кодировке ANSI, а файл result_other.txt вообще не создается

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


Старожил


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

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


LAKERS824, к сожалению, я не телепат, чтобы определить кодировку ваших xml-файлов. Судя по тому, что файлы с результатами создавались в utf-8, я предположил, что xml в такой же кодировке, и вписал пару "utf8..cp1251/" в скрипт. Уточните, в какой именно они кодировке и исправьте её в скрипте самостоятельно - либо приложите несколько заархивированных xml для образца, чтобы я сам исправил.

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


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


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

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


Вложения
Тип файла: xml 3143719278_1605201290029.xml
(19.4 Kb, 6 просмотров)

вложил один xml

Отправлено: 17:22, 07-07-2012 | #19


Старожил


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

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


Тип XML: Конец строки - win (CR+LF), Кодировка - UTF8 без BOM
Файл с результатом, без recode: Конец строки - win (CR+LF), Кодировка - UTF8 без BOM
Файл с результатом, в который всё писалось через recode: Конец строки - win (CR+LF), Кодировка - cp1251
Всё верно, пара кодировок правильная, вот результат обработки вашего xml:


Вы точно запускаете мой скрипт без модификаций? Файлы не должны создаваться пустыми, у меня всё работает, и на тестовых файлах, и на вашем xml.

Отправлено: 17:45, 07-07-2012 | #20



Компьютерный форум 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




 
Переход