Имя пользователя:
Пароль:
 | Правила  

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

Ответить
Настройки темы
CMD/BAT - Задача: парсинг текстового файла

Аватара для Лео Lапыч

Новый участник


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

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


Добрый день, системные администраторы и программисты-разработчики!

Давно хочу решить одну задачку средствами командного интерпретатора Windows, но всё времени не хватает углубиться в тонкости языка.
Задача возникла как скрипт ловушки для системы управления версиями Subversion. В частном случае я её решил, но хотелось бы в общем.
Итак, внимание, задачка:

Исходные данные. Есть текстовый файл, структура которого следующая:
Код: Выделить весь код
Path1 - Mask1_1
Mask1_...
Mask1_N-1
Mask1_N

Path... - Mask..._1
Mask..._...
Mask..._N-1
Mask..._N

PathM-1 - MaskM-1_1
MaskM-1_...
MaskM-1_N-1
MaskM-1_N

PathM - MaskM_1
MaskM_...
MaskM_N-1
MaskM_N
Пояснения: файл содержит путь, потом символы пробел, минус, пробел и первую маску; последующие маски, относящиеся к этому пути, начинаются с новой строки (CRLF); признаком окончания списка масок, относящихся к пути, являются пустая строка (CRLFCRLF) или конец файла. Дальше всё может повторится для другого пути. Количество путей и масок не ограничено (в разумных пределах).

Требуется получить в локальную переменную командного пакета строку вида:
Код: Выделить весь код
%Result% = "Path1\Mask1_1 Path1\Mask1_... Path1\Mask1_N-1 Path1\Mask1_N ... Path...\Mask..._1 Path...\Mask..._... Path...\Mask..._N-1 Path...\Mask..._N PathM-1\MaskM-1_1 PathM-1\MaskM-1_... PathM-1\MaskM-1_N-1 PathM-1\MaskM-1_N PathM\MaskM_1 PathM\MaskM_... PathM\MaskM_N-1 PathM\MaskM_N"
То есть разложить этот файл в строку, содержащую пути с маской, разделённые пробелом. Кроме того, все символы разделителя пути / должны быть преобразованы в \.
Возможен, конечно, косяк, если в имени пути или маске содержатся пробелы, либо в имени пути содержатся подряд идущие символы пробел, минус, пробел. Но такие случаи пока от условий задачи отсечём.

Пример:
На основе файла
Код: Выделить весь код
Projects/Builder - *.~*
*.$*
*.obj

Projects/CSharp - *.cache*
*.suo
Должна получится строка
Код: Выделить весь код
Projects\Builder\*.~* Projects\Builder\*.$* Projects\Builder\*.obj Projects\CSharp\*.cache* Projects\CSharp\*.suo
Более высокоуровневые языки для решения использовать пока не хочу. Так что у кого на досуге будет время поломать голову, прошу поделиться мыслями.
Благодарен уже за уделённое внимание!

Отправлено: 13:30, 31-12-2015

 

Ветеран


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

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


Цитата Лео Lапыч:
На основе файла »
Код: Выделить весь код
@echo off
setlocal

for /f "tokens=*" %%i in (1.txt) do call:0 %%i
echo.
goto:eof

:0
if not "%2"=="" (0>nul set /p="%~1\%3 " & set p=%~1) else (0>nul set /p="%p%\%1 ")
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:24, 31-12-2015 | #2



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

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


Аватара для Лео Lапыч

Новый участник


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

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


Спасибо, Иностранец. Честно говоря, это читерство какое-то. Ничего не понял. Разбираться не стал, ибо столько водки дома уже нету. Скрипт почти работает.
Выводит
Код: Выделить весь код
Projects/Builder\*.~* Projects/Builder\*.$* Projects/Builder\*.obj Projects/CSharp\*.cache* Projects/CSharp\*.suo
А надо
Код: Выделить весь код
Projects\Builder\*.~* Projects\Builder\*.$* Projects\Builder\*.obj Projects\CSharp\*.cache* Projects\CSharp\*.suo
По условию задачи
Цитата:
Кроме того, все символы разделителя пути / должны быть преобразованы в \.
А ещё хотелось бы в конце
Код: Выделить весь код
echo %Result%
в которой бы и был результат преобразований.

Мне необходимо вызывать эту :0 в нескольких местах моего скрипта. Предусмотрено ли что-то вроде ret, чтобы вернуться в место после вызова? Или goto - наше всё?

И ещё. Всё таки для борьбы с пробелами в путях и масках, пусть каждая полная маска будет заключена в кавычки.
То есть
Код: Выделить весь код
"Projects\Builder\*.~*" "Projects\Builder\*.$*" "Projects\Builder\*.obj" "Projects\CSharp\*.cache*" "Projects\CSharp\*.suo"
Спасибо ещё разок!

Последний раз редактировалось Лео Lапыч, 03-01-2016 в 21:51.


Отправлено: 21:38, 03-01-2016 | #3


Ветеран


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

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


Цитата Лео Lапыч:
По условию задачи
Цитата:
Кроме того, все символы разделителя пути / должны быть преобразованы в \.
В принципе, пока окончательно не выпилили POSIX — для ОС NT разницы быть не должно. Другое дело, если какие-то утилиты не пользуются функциями ОС, а сами пытаются делать такие операции как разбивка пути на составляющие по символу «/».

Цитата Лео Lапыч:
Предусмотрено ли что-то вроде ret, чтобы вернуться в место после вызова? Или goto - наше всё? »
Скрытый текст
Код: Выделить весь код
…
call :Метка
…
exit /b 0
…
:Метка
…
exit /b 0

Можно даже значения возвращать в переменную окружения .

Отправлено: 22:11, 03-01-2016 | #4


Аватара для Лео Lапыч

Новый участник


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

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


Цитата Iska:
В принципе, пока окончательно не выпилили POSIX — для ОС NT разницы быть не должно. Другое дело, если какие-то утилиты не пользуются функциями ОС, а сами пытаются делать такие операции как разбивка пути на составляющие по символу «/». »
Проверил. Хавает и так, и так. Так что условие
Цитата Лео Lапыч:
Кроме того, все символы разделителя пути / должны быть преобразованы в \. »
убираем.

Про exit /b понял. Спасибо!

Цитата Iska:
Можно даже значения возвращать в переменную окружения . »
Это лишнее.

Отправлено: 10:32, 04-01-2016 | #5


Ветеран


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

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


Цитата Лео Lапыч:
все символы разделителя пути / должны быть преобразованы в \ »
Код: Выделить весь код
@echo off
setlocal

for /f "tokens=*" %%i in (1.txt) do call:0 %%i
goto:eof

:0

set "a=%~1"
if not "%2"=="" (0>nul set /p="%a:/=\%\%3 " & set p=%a:/=\%) else (0>nul set /p="%p%\%a% ")

Отправлено: 13:04, 04-01-2016 | #6


Аватара для Лео Lапыч

Новый участник


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

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


Спасибо! А что насчёт
Цитата Лео Lапыч:
А ещё хотелось бы в конце
Код: Выделить весь код
echo %Result%
в которой бы и был результат преобразований. »
и
Цитата Лео Lапыч:
Всё таки для борьбы с пробелами в путях и масках, пусть каждая полная маска будет заключена в кавычки. То есть
Код: Выделить весь код
"Projects\Builder\*.~*" "Projects\Builder\*.$*" "Projects\Builder\*.obj" "Projects\CSharp\*.cache*" "Projecs\CSharp\*.suo"»
?

Отправлено: 13:41, 04-01-2016 | #7


Ветеран


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

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


Тогда так:
Код: Выделить весь код
@echo off
setlocal

for /f "tokens=*" %%i in (1.txt) do call:0 %%i

set "result=%result:/=\%"
echo %result%

goto:eof

:0

if not "%2"=="" (set "p=%~1" && set res="%~1\%3") else (set res="%p%\%1")
if defined result (set result=%result% %res%) else (set result=%res%)

Отправлено: 15:21, 04-01-2016 | #8


Аватара для Лео Lапыч

Новый участник


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

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


Спасибо всем!
Скрипт автоматизации добавления новых файлов под версионный контроль при фиксации обновлений теперь работает в общем виде и правильно учитывает свойства svn:global-ignores и svn:ignore, чего и требовалось от него добиться.

Отправлено: 22:48, 05-01-2016 | #9



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBS/WSH/JS - Парсинг файла pogo Скриптовые языки администрирования Windows 1 20-09-2013 11:57
CMD/BAT - Сборка текстового файла из содержимого другого текстового файла icomboy Скриптовые языки администрирования Windows 0 10-09-2013 15:17
Java - Парсинг doc-файла Hector Программирование и базы данных 7 15-03-2012 21:37
[решено] Парсинг php файла Shym Вебмастеру 2 15-11-2009 02:30
CMD/BAT - [решено] Как скопировать имя файла из текстового файла в код батника и т.д. Nun-Nun Скриптовые языки администрирования Windows 6 13-05-2009 13:28




 
Переход