Войти

Показать полную графическую версию : [решено] Проверка файла на определнное содержимое и перемещение его.


скуби_ДУ
27-07-2011, 13:15
Имеем папку Upload в ней около 10тыщ маловесных файлов xml формата
Необходимо файлы в которых содержится

<КодСтроки>10</КодСтроки>
<Сумма>0.00</Сумма>

скопировать либо переместить - неважно , в подпапку "Выборка" папки "Upload"

заранее спасибо всем гуру

скуби_ДУ
27-07-2011, 13:16
все файлы естественно с разными именами.
только одинаковое расширение...

Iska
27-07-2011, 14:16
скуби_ДУ, Вам это действительно надо будет делать на регулярной основе и программно? Или это однократное действие?

Busla
27-07-2011, 15:27
скуби_ДУ, указанные строки должны идти строго подряд или просто содержаться в файле?

скуби_ДУ
28-07-2011, 08:29
сейчас это однократное действие которое возможно и будет регулярным раз в месяц при естественно уже меньшем кол-ве файлов. строки должны идти именно в такой последовательности - собственно во всех файлах значение этой суммы либо 0 - и их отобрать надо - в других файлах оно отлично от нуля и эти файлы не нужны

Busla
28-07-2011, 09:38
На jscript или powershell реализуется довольно просто. А вот в bat выискивать многострочный блок текста - нетривиальная задача.

amel27
28-07-2011, 09:51
как минимум, для 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)

amel27
29-07-2011, 07:01
Для работы скрипта нужен 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
02-08-2011, 13:07
для так сказать расширения кругозора пробовал первый способ amel27. не отрабатывает видимо изза кодировки? »да, из-за особенностей утилиты FINDSTR этот скрипт будет работать только для файлов DOS/866 кодировки
для WIN/1251 можно использовать FIND, но парсить её результат будет гораздо сложней

скуби_ДУ
02-08-2011, 15:00
подскажите пожалуйста как сделать с кодировкой win1251?

amel27
03-08-2011, 10:37
скуби_ДУ, на FIND чуть позже, а вариант на AWK из #9 не работает?

скуби_ДУ
04-08-2011, 14:57
чтото делается т.е. батник выполняется пару минут но результата не видно. все файлы остались в аплоаде




© OSzone.net 2001-2012