1

Тема: VBS сортировка файлов по содержимому

Есть папка с файлами txt, в каждом файле есть строка вида
Sum=1742,00
Это сумма заказа. Строка иногда на 10й иногда на 9й строчке файла
Строка уникальна, больше в файле не повторяется.
Нужно заказы с суммой более 1500 копировать в другую папку.
Я нашел похожий скрипт и попытался переделать его под себя.
Что у меня не выходит
1. Как найти строчку по слову Sum? нужно перебирать все строки, пока первые 3 символа строки не совпадут? потом запомнить номер этой строки для дальнейших действий?
2. Как присвоить переменной b число после "Sum=" (сейчас я так понимаю ей присваивается текст)
3. В скрипте во время тестов я попытался копировать файл в папку e:\temp\zakaz\1500 - при запуске выдается ошибка что нужно разрешение.
Извиняюсь за глупые вопросы )
Вот скрипт.
'************************************************************************************************
'Скрипт должен искать строку суммы заказа в файле, затем по сумме заказа копировать файл в нужную папку
'***********************************************************************************************

Option Explicit

dim oFSO, oFolder, oFolder1, oFile, oFileCopy
dim coll
dim a, b



set oFSO=CreateObject("Scripting.FileSystemObject") 'Создаем объектную модель FSO
set oFolder=oFSO.GetFolder("e:\temp\zakaz") 'Даем доступ к папке e:\temp\zakaz\ и создаем объект Folder
set oFolder1=oFSO.GetFolder("e:\temp\zakaz\1500") 'Даем доступ к папке e:\temp\zakaz\1500 и создаем объект Folder

For Each a in oFolder.Files 'Наполняем массив а значениями из папки e:\temp\zakaz\ через свойство объекта Folder.Files
coll = a.Path 'Узнаем путь к каждому файлу из массива
set oFile = oFSO.OpenTextFile(coll, 1, 0)   'Открываем файл для чтения
oFile.SkipLine
oFile.SkipLine
oFile.SkipLine
oFile.SkipLine
oFile.SkipLine
oFile.SkipLine
oFile.SkipLine
oFile.SkipLine
oFile.SkipLine
oFile.Skip 24
b = oFile.Read (7) 'Считываем 10 строку и 7 символов стоки и просваиваем значение переменной b
Call MySub
oFile.Close 'Закрываем файл
Next

Sub MySub 'Процедура сортирует файлы в зависимости от содержания переменной b
If b  >  1500 then
set oFileCopy=oFSO.GetFile(coll)
oFileCopy.Copy"e:\temp\zakaz\0"

End If 
End Sub


set oFolder=Nothing
set oFile=Nothing
set oFileCopy=Nothing

set oFSO=Nothing
MsgBox "Конец сортировки"

2 (изменено: panda4x4, 2019-02-20 11:09:49)

Re: VBS сортировка файлов по содержимому

Отвечаю сам себе.
Чтобы считать сумму заказа, достаточно пропустить первые 4 символа нужной строки
Осталось разобраться, почему не копируется файл - ошибка разрешение отклонено

'************************************************************************************************
'Скрипт должен искать строку суммы заказа в файле, затем по сумме заказа копировать файл в нужную папку
'***********************************************************************************************

Option Explicit

dim oFSO, oFolder, oFolder1, oFile, oFileCopy
dim coll
dim a, b



set oFSO=CreateObject("Scripting.FileSystemObject") 'Создаем объектную модель FSO
set oFolder=oFSO.GetFolder("e:\temp\zakaz") 'Даем доступ к папке e:\temp\zakaz\ и создаем объект Folder


For Each a in oFolder.Files 'Наполняем массив а значениями из папки e:\temp\zakaz\ через свойство объекта Folder.Files
coll = a.Path 'Узнаем путь к каждому файлу из массива
set oFile = oFSO.OpenTextFile(coll, 1, 0)   'Открываем файл для чтения
oFile.SkipLine
oFile.SkipLine
oFile.SkipLine
oFile.SkipLine
oFile.SkipLine
oFile.SkipLine
oFile.SkipLine
oFile.SkipLine
oFile.SkipLine
oFile.Skip 4    'пропускаем в строке 4 первых символа
b = oFile.Read (8) 'Считываем 10 строку и 7 символов стоки и просваиваем значение переменной b
Call MySub
oFile.Close 'Закрываем файл
Next

Sub MySub 'Процедура сортирует файлы в зависимости от содержания переменной b
If b  < 1500 then
MsgBox "Сумма заказа слишком мала "+b
'set oFileCopy=oFSO.GetFile(coll)
'oFileCopy.Copy"e:\temp\zakaz"
else
MsgBox "Заказ принят "+b


End If 
End Sub


set oFolder=Nothing
set oFile=Nothing
set oFileCopy=Nothing

set oFSO=Nothing

3

Re: VBS сортировка файлов по содержимому

Работает ) Не хватало слэша в конце пути

'************************************************************************************************
'Скрипт должен искать строку суммы заказа в файле, затем по сумме заказа копировать файл в нужную папку
'***********************************************************************************************

Option Explicit

dim oFSO, oFolder, oFolder1, oFile, oFileCopy
dim coll
dim a, b



set oFSO=CreateObject("Scripting.FileSystemObject") 'Создаем объектную модель FSO
set oFolder=oFSO.GetFolder("e:\temp\zakaz") 'Даем доступ к папке e:\temp\zakaz\ и создаем объект Folder


For Each a in oFolder.Files 'Наполняем массив а значениями из папки e:\temp\zakaz\ через свойство объекта Folder.Files
coll = a.Path 'Узнаем путь к каждому файлу из массива
set oFile = oFSO.OpenTextFile(coll, 1, 0)   'Открываем файл для чтения
oFile.SkipLine
oFile.SkipLine
oFile.SkipLine
oFile.SkipLine
oFile.SkipLine
oFile.SkipLine
oFile.SkipLine
oFile.SkipLine
oFile.SkipLine
oFile.Skip 4    'пропускаем в строке 4 первых символа
b = oFile.Read (8) 'Считываем 10 строку и 7 символов стоки и просваиваем значение переменной b
Call MySub
oFile.Close 'Закрываем файл
Next

Sub MySub 'Процедура сортирует файлы в зависимости от содержания переменной b
If b  < 1500 then
MsgBox "Сумма заказа слишком мала "+b
'set oFileCopy=oFSO.GetFile(coll)
'oFileCopy.Copy"e:\temp\zakaz"
else
MsgBox "Заказ принят "+b
set oFileCopy=oFSO.GetFile(coll)
oFileCopy.Copy"e:\temp\zakaz\1500\"

End If 
End Sub


set oFolder=Nothing
set oFile=Nothing
set oFileCopy=Nothing

set oFSO=Nothing

4 (изменено: alexii, 2019-02-20 18:40:20)

Re: VBS сортировка файлов по содержимому

«Неправильно ты, Дядя Фёдор, бутерброд ешь (зачеркнуть) ищешь».

panda4x4, Вам следует прочитать всё содержимое файла в переменную, затем воспользоваться регулярным выражением для поиска и получения суммы заказа, которую потом Вы будете сравнивать с искомым ограничением.

5

Re: VBS сортировка файлов по содержимому

Я бы наверное так сделал.

Post's attachments

SortOrders.zip 2.82 kb, 4 downloads since 2019-03-03 

You don't have the permssions to download the attachments of this post.
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

6

Re: VBS сортировка файлов по содержимому

alexii пишет:

panda4x4, Вам следует прочитать всё содержимое файла в переменную, затем воспользоваться регулярным выражением....

Полностью согласен!
Такие вещи лучше всего делаются по схеме "вычитываем в массив + обрабатываем регуляркой".
Т.е. построчно вычитываем файл в переменную-массив, а затем регуляркой проверяем - нет ли в строке "мусора" (непечатных символов, пробелов, табов и проч.) а затем уже ищем искомые данные.
Вот это "'пропускаем в строке 4 первых символа" - в корне не правильно - завтра  у вас в "шапку" файла добавиться коммент  или перенос строки/"мусор" от входящих данных, и вся ваша логика пойдет "по бороде"!
И вообще, лучше уж делать в Js или Powershell через конструкцию try, catch, finaly - с явной обработкой исключений.

7

Re: VBS сортировка файлов по содержимому

NovaRo, а где тут место исключениям для срабатывания? Я не особо вижу.

8

Re: VBS сортировка файлов по содержимому

alexii, думаю в случае если сумма, например, с дробной частью, а разделитель целой и дробной части в системных настройках указан не такой как в строке.

Пример - в файле строка "Sum=1500.55", а в системных настройках стоит разделитель ",". Тогда CCur("1500.55") вернёт ошибку.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

9

Re: VBS сортировка файлов по содержимому

Xameleon, тогда хрен мы регуляркой выцепим из текста эту сумму . Не?

10

Re: VBS сортировка файлов по содержимому

alexii, почему ? Я в своём примере выше сделал отбор по ^sum\s*=\s*([0-9,.\s]+)$. Так как я далеко не знаток регулярок, возможно это неверно, но дальше значение проверяю на IsNumeric для удобства. А вот результат IsNumeric будет уже зависеть от региональных настроек, как я понял. Но автор об этом не спросил и я решил оставить решение этого вопроса на его усмотрение.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !