1

Тема: VBS: Открытие csv файлов по дате и по отрывку в названий

Здравствуйте уважаемые форумчане! Помогите решить следующую проблему есть папка "DataBase" в которую раз в сутки поступают файлы "csv" со следующим названием:
- MAG8000_296305H319_2020-02-26
- MAG8000_296305H319_2020-02-08
Задача состоит в том чтоб считывать актуальные данные с этих файлов т.е. с последней датой сохранения. Скрипт для считывания данных я написал. Вопрос: возможно ли написать скрипт который будет открывать файл по отрывку в названий например "MAG8000_296305H319" и по последней дате сохранения? Если это возможно буду рад подсказке.

2

Re: VBS: Открытие csv файлов по дате и по отрывку в названий

Rabi, так по дате в имени файла или по дате-времени последней модификации?!

3

Re: VBS: Открытие csv файлов по дате и по отрывку в названий

можно одно из двух без разницы

4 (изменено: Rumata, 2020-06-15 10:06:37)

Re: VBS: Открытие csv файлов по дате и по отрывку в названий

Есть команда DIR. С помощью ключей можно получить разные списки:

/b - простой список
/a-d - только файлы
/o-n - сортировать по именам файлов в обратном порядке
/o-d /tw - сортировать по дате последнего изменения

Примеры испльзования

1. отображает простой список заданных файлов, отсортированных по именам в обратном порядке


dir /b /a-d /o-n MAG8000_296305H319_*

2. отображает простой список заданных файлов, отсортированных по времени последней модификации


dir /b /a-d /o-d /tw MAG8000_296305H319_*

Таким образом обе команды в Вашем случае выведут искомый файл в первую позицию списка. Остается получить его -- используйте примерно такую конструкцию:


for /f "tokens=*" %%f in ( 'команда получения списка...' ) do (
	какая-то команда "%%~f"
	goto :EOF
)

Или в Вашем скрипте добавить несколько операций для доступа к файловой системе с помощью WSH, сортировки списка и получения самого последнего файла.

( 2 * b ) || ! ( 2 * b )

5

Re: VBS: Открытие csv файлов по дате и по отрывку в названий

Rumata здравствуйте.

Таким образом обе команды в Вашем случае выведут искомый файл в первую позицию списка. Остается получить его -- используйте примерно такую конструкцию:


Можете подсказать как добавить ваш метод в мой скрипт для чтения csv файлов.

Sub read()
Dim fso, f, field, MyZf

' Create file object -- Objekt erstellen
Set fso = CreateObject("Scripting.FileSystemObject")
SmartTags("filename2") = "C:\file\MAG8000_344305H329_2020-04-09 0702.csv"
Set f = fso.OpenTextFile("C:\file\MAG8000_344305H329_2020-04-09 0702.csv", 1)


' Read values till end of file -- Werte bis zum Dateiende einlesen
Do While Not f.AtEndOfStream 
	MyZf = f.ReadLine
Loop
field = Split(MyZf, ";")
	
SmartTags("tag_1") = field(0)
SmartTags("tag_2") = field(3)
SmartTags("tag_3") = field(6)

' Tidy up -- Aufraeumen
fso.Close
Set f = Nothing
Set fso = Nothing

End Sub

6

Re: VBS: Открытие csv файлов по дате и по отрывку в названий

Rabi пишет:

как добавить ваш метод в мой скрипт для чтения csv файлов

Ваш скрипт написан на VBS. Мои предложения - на BAT/CMD. Это отдельный скрипт.

( 2 * b ) || ! ( 2 * b )

7

Re: VBS: Открытие csv файлов по дате и по отрывку в названий

Вероятно, из BAT вызывать VBS.
Вот в этом месте

	какая-то команда "%%~f"

"какой-то командой" должен быть скрипт VBS. А в нём, в свою очередь, вместо константных имён файлов использовать WScript.Arguments.

8

Re: VBS: Открытие csv файлов по дате и по отрывку в названий

Я бы сделал чуть более универсально:


dim ifile
if WScript.Arguments.length = 0 then
	set ifile = WScript.StdIn
else
	with CreateObject("Scripting.FileSystemObject")
		set ifile = .OpenTextFile(WScript.Arguments(0))
	end with
end if

dim line
do while not ifile.AtEndOfStream
	line = ifile.ReadLine
	WScript.Echo(line)
loop

ifile.Close

Кода чуть больше, но и возможностей -- больше.

-- вызов скрипта с файлом в качестве параметра

cscript VBSCRIPT FILENAME

-- вызов скрипта в конвейере (чтение входного потока STDIN)

type FILENAME | cscript VBSCRIPT

-- вызов скрипта и передача файла на входной поток STDIN

cscript VBSCRIPT < FILENAME

А если не заморачиваться с такими универсальностями, то скрипт можно сильно сократить, просто читая STDIN (мой любимый способ):


set stdin = WScript.StdIn
do while not stdin.AtEndOfStream
	line = stdin.ReadLine
	WScript.Echo(line)
loop

И в Вашем случае вызывать его так:


for /f "tokens=*" %%f in ( 'команда получения списка...' ) do (
	cscript //nologo VBSCRIPT < "%%~f"
	goto :EOF
)

Естественно, что это просто примеры, и в VBS цикле должна выполняться какая-то более полезная чем простой вывод работа.

( 2 * b ) || ! ( 2 * b )