Войти

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


Mushroomhead
20-07-2014, 10:20
Всем привет, уважаемые форумчане! С bat знаком постольку-поскольку, но возникла необходимость его применения. Буду благодарен, если поможете решить одну задачку!
Смысл такой: допустим, что в папку C:\in падает большое кол-во файлов *.xml в кодировке Windows-1251. В каждом из таких файлов есть строка, содержащая номер счёта, типа "НомСч="66000011112222333344"". Необходимо разделить все эти файлы на две папки C:\in\1 и C:\in\2, в зависимости от значения номера счёта.
в C:\in\1 попадают - все счета, начинающиеся на 7788, 40 (исключение 408)
в C:\in\2 попадают - все счета, начинающиеся на 6677, 408

Пытался что-то набросать, но возникали проблемы с кодировками и ещё с чем-то :sorry: ...


@echo off
setlocal enableextensions
set src=C:\in\
set in1=C:\in\1
set in2=C:\in\2
if not exist "%in1%" md "%in1%"
if not exist "%in2%" md "%in2%"
for /F "delims=" %%A IN ('findstr /M /C:".*НомСч=\"6677.*" "%src%\*.*"') DO copy "%%~A" "%in2%"
for /F "delims=" %%A IN ('findstr /M /C:".*НомСч=\"408.*" "%src%\*.*"') DO copy "%%~A" "%in2%"
pause

Iska
20-07-2014, 13:11
В каждом из таких файлов есть строка, »
Такая строка — единственная?

…счета, начинающиеся на 7788, 40 (исключение 408)
…счета, начинающиеся на 6677, 408 »
Выложите образцы/примеры xml-файлов, упакованных в архив. Для охвата всех условий.

Mushroomhead
20-07-2014, 15:04
Прикрепляю архив с двумя файлами-примерами. Т.К. речь идёт об отчётных документах банка, предварительно обезличил информацию в них...

Iska
21-07-2014, 08:21
Mushroomhead, вот Вам примерная болванка на WSH:
Option Explicit

Dim strSourceFolder

Dim objRegExp
Dim dictPatternsAndDestFolders

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemEventSource
Dim objSWbemObjectEx

Dim strDestFolder


strSourceFolder = "C:\in"

Set objRegExp = WScript.CreateObject("VBScript.RegExp")
Set dictPatternsAndDestFolders = WScript.CreateObject("Scripting.Dictionary")

With dictPatternsAndDestFolders
.Add "^(6677|408)\d*$", "C:\in\1"
.Add "^(7788|40[^8])\d*$", "C:\in\2"
End With


strComputer = "."

Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")

Set objSWbemEventSource = objSWbemServicesEx.ExecNotificationQuery( _
"SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE " & _
"TargetInstance ISA 'CIM_DirectoryContainsFile' AND " & _
"TargetInstance.GroupComponent = 'Win32_Directory.Name=""" & Replace(strSourceFolder, "\", "\\\\") & """'" _
)


WScript.Echo "Monitor files creation in [" & strSourceFolder & "]..."

Do
With objSWbemServicesEx.Get(objSWbemEventSource.NextEvent.TargetInstance.PartComponent)
WScript.Echo Now() & " | < | New file: [" & .Name & "]"

Select Case LCase(.Extension)
Case "xml"
strDestFolder = TestAndGetDestFolder(.Name)

If Not IsEmpty(strDestFolder) Then
If .Copy(strDestFolder & "\" & .FileName & "." & .Extension) = 0 Then
WScript.Echo Now() & " | > | Copy into: [" & strDestFolder & "]"
Else
WScript.Echo Now() & " | ! | Can't copy into: [" & strDestFolder & "]"
End If
End If
Case Else
' Nothing to do
End Select

If .Delete() = 0 Then
WScript.Echo Now() & " | v | Delete file: [" & .Name & "]"
Else
WScript.Echo Now() & " | ! | Can't delete file: [" & .Name & "]"
End If
End With
Loop

WScript.Quit 0
'=============================================================================

'=============================================================================
Function TestAndGetDestFolder(strFileName)
Dim strPattern

TestAndGetDestFolder = Empty

With WScript.CreateObject("Msxml2.DOMDocument")
If .load(strFileName) Then
With .selectSingleNode("/Файл/Документ/СвСчет/@НомСч")
For Each strPattern In dictPatternsAndDestFolders.Keys
objRegExp.Pattern = strPattern

If objRegExp.Test(.nodeValue) Then
TestAndGetDestFolder = dictPatternsAndDestFolders.Item(strPattern)

Exit For
End If
Next
End With
Else
WScript.Echo "Can't load xml content from [" & strFileName & "]."
End If
End With
End Function
'=============================================================================
Запускать под «cscript.exe».

Mushroomhead
21-07-2014, 14:09
Блин! Спасибо, конечно. Вы просто титаническую работу проделали для моей задачи! Но у меня было пожелание сделать именно на bat. В нём бы я хоть что-то мог понять =))
Ваш скрипт попытался использовать, но он просто удаляет файлы, поступившие на вход. Пишет "Can't load xml content from..."

Iska
21-07-2014, 16:43
Mushroomhead, проверьте на тех файлах, что Вы выложили в архиве — на них работает?

Georgio
26-07-2014, 18:49
Но у меня было пожелание сделать именно на bat. В нём бы я хоть что-то мог понять =)) »

@echo off
setlocal enableextensions

set "src=C:\in"
set "in1=%src%\1"
set "in2=%src%\2"

if not exist "%in1%" md "%in1%"
if not exist "%in2%" md "%in2%"

(
echo НомСч="7788
echo НомСч="40[^8]
)>.tmp
for /f "delims=" %%A in ('findstr /mrg:.tmp "%src%\*.xml"') do copy "%%~A" "%in1%">nul

(
echo НомСч="6677
echo НомСч="408
)>.tmp
for /f "delims=" %%A in ('findstr /mg:.tmp "%src%\*.xml"') do copy "%%~A" "%in2%">nul

del .tmp
endlocal
exit /b




© OSzone.net 2001-2012