1

Тема: VBS: Отпарсить файл и сравнить

Добрый день, задача состоит в том чтобы не просто прочитать и отпарсить строки в файле. Это я сделал без проблем.
Есть некий текстовый файл, в нем есть строка, скажем иду.налево=20110224 (формат этой строки одинаковый, меняется лишь дата)
А нужна следующая логика:
1. Читаем файл
2. Если строка в файле начинается с фразы иду.налево, то начинаем парсить после символа =
3. Парсим следующим образом первые 4 цифры год, затем 2 месяц и последние 2 день
4. После этого самое сложное сравнимаем полученную дату с текущей датой на компьютере.

Это возможно сделать средствами VBS? у меня наибольшее затруднение вызывают 3 и 4-ый пункт. Подскажите куда копать. Спасибо.

2

Re: VBS: Отпарсить файл и сравнить

Да. Это можно сделать выбранными средствами - Mid, CDate, Now

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

3

Re: VBS: Отпарсить файл и сравнить

Ссылку на пример можно будет?

4

Re: VBS: Отпарсить файл и сравнить

Так кажется нашел DateDiff, позволяет сравнить время.
С CDate пока не могу разобраться, в формате применения.

А вот как распарсить? то есть передать CDate не всю строку, а символы начиная с 15 например? Сам формат файла и количество символов в нем не меняется.

5 (изменено: cbh, 2011-02-24 17:41:13)

Re: VBS: Отпарсить файл и сравнить

Вот кажется нашел другой способ. Возможно так будет легче. Хотя конечно логика расписанная раньше более удачна.

sdate = "20110224"
sday = Right(sdate, 2)

Так как строка всегда имеет строгий формат, в конце всегда стоит день. В принципе мне достаточно будет сравнить текущий день с днем в строке и если отличаются то сгенерить некое событие. Не знаю можно ли сравнивать только день.
То есть прочитать вторую строчку, как то так что ли)) (не знаю как прочитать именно вторую строку и именно последние два символа)

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("С:\test.txt", ForReading)
Const ForReading = 1
Dim arrFileLines()
i = 0
Do Until objFile.AtEndOfStream
Redim Preserve arrFileLines(i)
arrFileLines(i) = objFile.ReadLine
i = i + 1
Loop
objFile.Close
For [b]second [/b] strLine in arrFileLines
sdate = "иду.налево=20101221"
sday = Right(sdate, 2)

Next

Может кому-то придет в голову интересное решение.
Буду признателен за любую помощь.

6

Re: VBS: Отпарсить файл и сравнить

Это будет работать при условии, что в строке будут строго 8 цифровых символов и при отсутствии пробелов вокруг знака равенства.

s = "иду.налево=20110224"

p = InStr(s, "=")
if p = 1 then
    WScript.Echo "Nothing"
    WScript.Quit
end if

sdate = Mid(s, p + 1, 8)
y = Left(sdate, 4)
m = Mid(sdate, 5, 2)
d = Right(s, 2)

d1 = CDate(y & "/" & m & "/" & d)
d2 = Now

WScript.Echo d1
WScript.Echo d2
WScript.Echo DateDiff("d", d1, d2)

Мне кажется, что такие вещи решаются с помощью регулярных выражений. Код становится гораздо компактнее и понятнее.

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

7 (изменено: DnsIs, 2011-02-24 18:43:00)

Re: VBS: Отпарсить файл и сравнить

Ну вот, Rumata, меня опередил. Я тоже примерчик накатал. Раскатал строку как с помощью "Mid", так и с помощью регулярок.

s="иду.налево=20110224"

Set objRegExp = CreateObject("VBScript.RegExp")    'создается объект регулярных выражений
objRegExp.IgnoreCase = True                        'независимость от регистра символов
objRegExp.Pattern = "^иду.налево=(\d{4})(\d\d)(\d\d)"

If objRegExp.Test(s) Then
  a = CStr(Now)
  b = Mid(a,1,2)&Mid(a,4,2)&Mid(a,7,4)
  Set q = objRegExp.Execute(s).Item(0).Submatches
  e = q.Item(2)&q.Item(1)&q.Item(0)
  If e = b Then
    MsgBox "Даты совпали"
  Else
    MsgBox "Даты не совпали"
  End If
Else
    MsgBox "Строки со словами 'иду.налево' не найдена"
End If
Нас невозможно сбить с пути, нам пофигу куда идти.

8

Re: VBS: Отпарсить файл и сравнить

Насколько я знаю синтаксис vbs относительно регулярных выражений, настолько он мне кажется неудобным в сравнении с другими языками. Поэтому я не стал приводить пример с ними.

Мне кажется, что результат CStr(Now) существенно зависит от языковых настроек в системе. Лучше сравнивать даты с помощью встроенных функций.

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

9

Re: VBS: Отпарсить файл и сравнить

OFF: В принципе, можно получить независимый формат: VBScript: получение формата дата-время для имени файла. А сравнивать, конечно, нужно так:

Rumata пишет:

Лучше сравнивать даты с помощью встроенных функций.

10 (изменено: cbh, 2011-02-24 22:55:27)

Re: VBS: Отпарсить файл и сравнить

Rumata, DnsIs
спасибо ребята оба варианта, отрабатываются идеально, прямо смотреть приятно...вот только один момент, s="иду.налево=20110224" это ведь константа в данных примерах, c которой и идет сравнение текущей даты, а нужно прочитать файл. То есть найти в файле "иду.налево=" дата после "=" всегда будет меняться.

11

Re: VBS: Отпарсить файл и сравнить

cbh пишет:

s="иду.налево=20110224" это ведь константа в данных примерах, c которой и идет сравнение текущей даты, а нужно прочитать файл. То есть найти в файле "иду.налево=" дата после "=" всегда будет меняться.

«s="иду.налево=20110224"» — это очередная строка, которая читается из файла. Т.е., наподобие:

Do Until objFile.AtEndOfStream
    s = objFile.ReadLine
    …

12 (изменено: cbh, 2011-02-25 11:27:00)

Re: VBS: Отпарсить файл и сравнить

Спасибо alexii, Rumata, DnsIs

Все получилось.