Показать полную графическую версию : [решено] Проверка файла на определнное содержимое и перемещение его.
скуби_ДУ
27-07-2011, 13:15
Имеем папку Upload в ней около 10тыщ маловесных файлов xml формата
Необходимо файлы в которых содержится
<КодСтроки>10</КодСтроки>
<Сумма>0.00</Сумма>
скопировать либо переместить - неважно , в подпапку "Выборка" папки "Upload"
заранее спасибо всем гуру
скуби_ДУ
27-07-2011, 13:16
все файлы естественно с разными именами.
только одинаковое расширение...
скуби_ДУ, Вам это действительно надо будет делать на регулярной основе и программно? Или это однократное действие?
скуби_ДУ, указанные строки должны идти строго подряд или просто содержаться в файле?
скуби_ДУ
28-07-2011, 08:29
сейчас это однократное действие которое возможно и будет регулярным раз в месяц при естественно уже меньшем кол-ве файлов. строки должны идти именно в такой последовательности - собственно во всех файлах значение этой суммы либо 0 - и их отобрать надо - в других файлах оно отлично от нуля и эти файлы не нужны
На jscript или powershell реализуется довольно просто. А вот в bat выискивать многострочный блок текста - нетривиальная задача.
как минимум, для CMD нужна кодировка исходных файлов
@echo off
SetLocal EnableDelayedExpansion
set "D1=C:\Upload"
set "D2=C:\Upload\Выборка"
set "$1=<КодСтроки>10</КодСтроки>"
set "$2=<Сумма>0.00</Сумма>"
if not exist "%D2%" MD "%D2%"
pushd "%D1%" && (
for /f "tokens=1,2* delims=:" %%a in ('findstr/xnc:"!$1!" /c:"!$2!" *.xml') do (
if "!$c!"=="!$1!" if "%%c"=="!$2!" if "!$a!"=="%%a" set/a "$=%%b-!$b!"& if !$! equ 1 move/-y "%%a" "%D2%"
set "$a=%%a"& set "$b=%%b"& set "$c=%%c"))
Anonymоus
28-07-2011, 22:54
Мой вариант:
@Echo Off
SetLocal EnableDelayedExpansion
Set TargetDir=D:\TEMP\Testing\Upload
Set i=0
If Not Exist "%TargetDir%\Выборка" Md "%TargetDir%\Выборка"
For /F "tokens=*" %%F In ('Dir "%TargetDir%\*.xml" /A-D /B') Do (
Grep -o "<КодСтроки>10</КодСтроки>" "%TargetDir%\%%F">nul&&^
Grep -o "<Сумма>0.00</Сумма>" "%TargetDir%\%%F">nul&&^
Move /Y "%TargetDir%\%%F" "%TargetDir%\Выборка\%%F"&&Set /A i+=1
Title Файлов перемещено !i!
)
Echo Работа завершена
Pause>nul
Заменяете значение TargetDir на свой путь, если не нужна индикация количества обработанных файлов - убираете SetLocal EnableDelayedExpansion и всё, относящееся к счётчику. По идее, должно работать с любой поддерживаемой grep кодировкой, я проверял на 1251. Сам скрипт сохранить в 866 для работы с кириллическими путями.
Для работы скрипта нужен grep, входящий в пакет утилит GnuWin32 core utils. Скачать его можно здесь (http://rghost.ru/16118551) (сам grep и нужные dll) или здесь (http://gnuwin32.sourceforge.net/packages/grep.htm) (официальная страница на sourceforge)
Для работы скрипта нужен grep, входящий в пакет утилит GnuWin32 core utils.»тогда уж сразу вариант на AWK (http://gnuwin32.sourceforge.net/packages/gawk.htm):
@for /f "delims=" %%a in (
'gawk "/<КодСтроки>10<\/КодСтроки>/ {getline;if ($0~/<Сумма>0.00<\/Сумма>/){print FILENAME;nextfile}}" *.xml'
) do move/-y "%%a" ".\Upload"
скуби_ДУ
29-07-2011, 11:40
спасибо анонимоусу - все отлично сработало...
скуби_ДУ
02-08-2011, 10:20
для так сказать расширения кругозора пробовал первый способ amel27. не отрабатывает видимо изза кодировки? кодировка windows 1251
для так сказать расширения кругозора пробовал первый способ amel27. не отрабатывает видимо изза кодировки? »да, из-за особенностей утилиты FINDSTR этот скрипт будет работать только для файлов DOS/866 кодировки
для WIN/1251 можно использовать FIND, но парсить её результат будет гораздо сложней
скуби_ДУ
02-08-2011, 15:00
подскажите пожалуйста как сделать с кодировкой win1251?
скуби_ДУ, на FIND чуть позже, а вариант на AWK из #9 не работает?
скуби_ДУ
04-08-2011, 14:57
чтото делается т.е. батник выполняется пару минут но результата не видно. все файлы остались в аплоаде
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.