как получить время и из строки в логе с определенным событием
еще интересно как к примеру получить время и из строки в логе с определенным событием
к примеру вот такой лог (log.txt)
Код:
[20101217:002616.27]:нужное событие
[20101217:002623.39]:ненужное событие
[20101217:002623.64]:нужное событие
[20101217:002624.27]:ненужное событие
[20101217:002624.39]:ненужное событие
[20101217:002624.89]:нужное событие
[20101217:002625.08]:ненужное событие
мне нужно получить время последнего нужного события
|
mitiya, не очень понятно, как данный вопрос связан с озвученной темой — сие явно противоречит Правилам форума. Также хотелось бы, чтобы Вы освоили употребление знаков препинания и заглавных букв — это весьма способствует правильному пониманию заданного вопроса.
Предположим, что лог-файл находится в «c:\0001\0001.txt» и имеет кодировку ANSI. Тогда извлечь время (опять же, поскольку Вы не указали, — по моим предположениям, что именно эти символы — время) последнего совпавшего события можно, например, так:
читать дальше »
Код:
Option Explicit
Const ForReading = 1
Dim objRegExp
Dim objMatch
Dim strLine
Dim strTrueLine
Dim strSubMatch
Set objRegExp = WScript.CreateObject("VBScript.RegExp")
objRegExp.Pattern = "\[\d{8}:(\d{6}.\d{2})\]:нужное событие"
With WScript.CreateObject("Scripting.FileSystemObject").OpenTextFile("C:\0001\0001.txt", ForReading)
Do Until .AtEndOfStream
strLine = .ReadLine()
If objRegExp.Test(strLine) Then
strTrueLine = strLine
End If
Loop
.Close
End With
For Each objMatch In objRegExp.Execute(strTrueLine)
For Each strSubMatch In objMatch.SubMatches
WScript.Echo strSubMatch
Next
Next
Set objRegExp = Nothing
WScript.Quit 0
Поскольку Вы не указали примерный размер лог-файла, чтение и разбор файла в примере производится не целиком, а построчно.
|
сразу несколько вопросов.
1. хотел вынести путь к файлу в переменную но скрипт начал выдавать ошибку
Dim logpath = C:\0001\0001.txt
дальше по коду некоторые места непонятны
Код:
Option Explicit <-- зачем это
Const ForReading = 1
Dim objRegExp
Dim objMatch
Dim strLine
Dim strTrueLine
Dim strSubMatch
Set objRegExp = WScript.CreateObject("VBScript.RegExp")
objRegExp.Pattern = "\[\d{8}:(\d{6}.\d{2})\]:нужное событие"
With WScript.CreateObject("Scripting.FileSystemObject").OpenTextFile("C:\0001\0001.txt", ForReading) я так понимаю тут
Do Until .AtEndOfStream получается последняя нужная строка
strLine = .ReadLine()
If objRegExp.Test(strLine) Then
strTrueLine = strLine
End If
Loop
.Close
End With
For Each objMatch In objRegExp.Execute(strTrueLine) а тут то что не понятно
For Each strSubMatch In objMatch.SubMatches кроме вывода времени.
WScript.Echo strSubMatch так и не понял как отделили время от всей остальной строки
Next
Next
Set objRegExp = Nothing
WScript.Quit 0
|
Цитата:
Цитата mitiya
1. хотел вынести путь к файлу в переменную но скрипт начал выдавать ошибку
Код:
Dim logpath = C:\0001\0001.txt
|
Код:
Dim logpath
logpath = "C:\0001\0001.txt"
…
With WScript.CreateObject("Scripting.FileSystemObject").OpenTextFile(logpath, ForReading)
…
Цитата:
Цитата mitiya
а тут то что не понятно кроме вывода времени. так и не понял как отделили время от всей остальной строки
|
При помощи регулярных выражений. Рассказать в нескольких словах, к сожалению, не получится.
|
Без рег выражений (цикл списал у Iska) обрабатываем файл построчно
Код:
LogFile = "e:\Delete\0001.txt"
strFind = ":нужное событие"
lastfound = "нужное событие не состоялось"
i = 0
With CreateObject("Scripting.FileSystemObject").OpenTextFile(LogFile, 1)
Do Until .AtEndOfStream
RL = .ReadLine()
j = InStr(1, RL, strFind) ' Ищем вхождение подстроки ":нужное событие" в каждой строке лог-файла
If j > 0 Then
lastfound = RL
i = j
End If
Loop
.Close
End With
MsgBox lastfound ' Если можно время с текстовкой
If i > 0 Then MsgBox Mid(lastfound, 1, i - 1) ' Если только время со скобками -используем функцию Mid
If i > 0 Then MsgBox Mid(lastfound, 2, i - 3) ' Если только время без скобок
То же самое - весь файл читаем в массив, массив просматриваем с конца. По идее, этот способ должен быть многократно быстрее. Ограничение на размер файла и число строк в нём не знаю.
Код:
LogFile = "e:\Delete\0001.txt"
strFind = ":нужное событие"
lastfound = "нужное событие не состоялось"
i = 0
With CreateObject("Scripting.FileSystemObject").OpenTextFile(LogFile, 1)
RL = Split(Replace(.ReadAll(), Chr(13), ""), Chr(10))
.Close
End With
N = UBound(RL)
For j = N To 1 Step -1
i = InStr(1, RL(j), strFind)
If i > 0 Then
lastfound = RL(j)
Exit For
End If
Next
MsgBox lastfound ' Если можно время с текстовкой
If i > 0 Then MsgBox Mid(lastfound, 1, i - 1) ' Если только время со скобками
If i > 0 Then MsgBox Mid(lastfound, 2, i - 3) ' Если только время без скобок
|
SendMessage |
10-01-2011 08:49 1585039 |
Цитата:
Цитата megaloman
То же самое - весь файл читаем в массив, массив просматриваем с конца. По идее, этот способ должен быть многократно быстрее. »
|
Еще быстрее, если разделителем массива взять ":нужное событие". Тогда берется просто предпоследний элемент массива и парсится.
Но самый быстрый способ в данном конкретном случае такой:
Код:
Option Explicit
Const ForReading = 1
Dim LogFile
Dim strText
LogFile = "C:\0001\0001.txt"
With WScript.CreateObject("Scripting.FileSystemObject").OpenTextFile(LogFile, ForReading)
strText = .ReadAll
.Close
End With
WScript.Echo Mid(strText, InStrRev(strText, "]:нужное событие") - 9, 9)
WScript.Quit 0
|
Цитата:
Цитата megaloman
Ограничение на размер файла и число строк в нём не знаю. »
|
Цитата:
Цитата SendMessage
Но самый быстрый способ в данном конкретном случае такой: »
|
Ограничение достаточно простое —
|
SendMessage |
10-01-2011 13:19 1585184 |
Iska, ну не стоит так уж заострять на этом внимание - вряд ли файл будет такого большого размера. Со 100 мб файлами мой скрипт вполне справляется.
А если уж он настолько велик, то и использовать FSO в любом виде уже не целесообразно (если только дробить, но не на строки, а при помощи Skip/Read). Как Вы справедливо и отметили. И скрипт будет совершенно другим по концепции. Но для этой конкретной задачи о нем, мне кажется, не стоит и заморачиваться. До тех пор пока не возникнет нужда. :)
|
Дык, это :)… я и не заострял — пользовал в сообщении тэги «off» и «more».
|
Время: 22:36.
© OSzone.net 2001-