Показать полную графическую версию : Сортировка файлов взависимости от содержимого
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
В каждом из таких файлов есть строка, »
Такая строка — единственная?
…счета, начинающиеся на 7788, 40 (исключение 408)
…счета, начинающиеся на 6677, 408 »
Выложите образцы/примеры xml-файлов, упакованных в архив. Для охвата всех условий.
Mushroomhead
20-07-2014, 15:04
Прикрепляю архив с двумя файлами-примерами. Т.К. речь идёт об отчётных документах банка, предварительно обезличил информацию в них...
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..."
Mushroomhead, проверьте на тех файлах, что Вы выложили в архиве — на них работает?
Но у меня было пожелание сделать именно на 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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.