Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Проверка файла на определнное содержимое и перемещение его. (http://forum.oszone.net/showthread.php?t=212039)

скуби_ДУ 27-07-2011 13:15 1720829

Проверка файла на определнное содержимое и перемещение его.
 
Имеем папку Upload в ней около 10тыщ маловесных файлов xml формата
Необходимо файлы в которых содержится

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

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

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

скуби_ДУ 27-07-2011 13:16 1720833

все файлы естественно с разными именами.
только одинаковое расширение...

Iska 27-07-2011 14:16 1720866

скуби_ДУ, Вам это действительно надо будет делать на регулярной основе и программно? Или это однократное действие?

Busla 27-07-2011 15:27 1720899

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

скуби_ДУ 28-07-2011 08:29 1721329

сейчас это однократное действие которое возможно и будет регулярным раз в месяц при естественно уже меньшем кол-ве файлов. строки должны идти именно в такой последовательности - собственно во всех файлах значение этой суммы либо 0 - и их отобрать надо - в других файлах оно отлично от нуля и эти файлы не нужны

Busla 28-07-2011 09:38 1721359

На jscript или powershell реализуется довольно просто. А вот в bat выискивать многострочный блок текста - нетривиальная задача.

amel27 28-07-2011 09:51 1721370

как минимум, для 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 1721921

Мой вариант:
Код:

@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. Скачать его можно здесь (сам grep и нужные dll) или здесь (официальная страница на sourceforge)

amel27 29-07-2011 07:01 1722021

Цитата:

Цитата Anonymоus
Для работы скрипта нужен grep, входящий в пакет утилит GnuWin32 core utils.»

тогда уж сразу вариант на AWK:
Код:

@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 1722141

спасибо анонимоусу - все отлично сработало...

скуби_ДУ 02-08-2011 10:20 1724398

для так сказать расширения кругозора пробовал первый способ amel27. не отрабатывает видимо изза кодировки? кодировка windows 1251

amel27 02-08-2011 13:07 1724505

Цитата:

Цитата скуби_ДУ
для так сказать расширения кругозора пробовал первый способ amel27. не отрабатывает видимо изза кодировки? »

да, из-за особенностей утилиты FINDSTR этот скрипт будет работать только для файлов DOS/866 кодировки
для WIN/1251 можно использовать FIND, но парсить её результат будет гораздо сложней

скуби_ДУ 02-08-2011 15:00 1724584

подскажите пожалуйста как сделать с кодировкой win1251?

amel27 03-08-2011 10:37 1725040

скуби_ДУ, на FIND чуть позже, а вариант на AWK из #9 не работает?

скуби_ДУ 04-08-2011 14:57 1725854

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


Время: 20:27.

Время: 20:27.
© OSzone.net 2001-