Извлечение данных между двумя строками (временными интервалами) из файла журнала или текстового документа с использованием VBA - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть файл журнала, который находится в МБ, и мне нужно извлечь данные только за один конкретный час и исключить оставшиеся данные.

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

Do Until FileIn.AtEndOfStream
    strTmp = FileIn.ReadLine
    If Len(strTmp) > 0 Then
        If (InStr(1, strTmp, Date & " " & LastHour, vbTextCompare) > 0) Then
            Fileout.WriteLine strTmp
        End If
    End If
Loop

Код для построчного извлечения данных с меткой времени

Мне нужно взять данные за 1 час из файла журнала и сохранить их в текстовом документе.

Может кто-нибудь помочь мне с этим, пожалуйста?

пример файла журнала

2019-01-02 00:54:08,886 [117] ERROR [(null)] - 
************START***************** Application Exception 2019-01-02 12:54:08 AM*****************************   


ERROR CODE             :::::: acdefba1-fdfc-4cef-bah5-082bjdbdd9e

System.NullReferenceException: Object reference not set to an instance of an object.
   at DynamicModule.ns.Wrapped_IDeliveryModelService_bc245ed8140c4a49aeaf2e2b7c9c7578.UpdateCart(FXCContextctx)  

*************END******************* Application Exception 2019-01-02 12:54:08 AM*************************  

2019-01-02 00:54:08,965 [95] DEBUG...  2019-01-02 01:01:08,965 [95] DEBUG...  2019-01-02 01:01:08,965 [95] DEBUG...
Sub ExtractLogs(textfilename, logfilename)
    'Const ForReading = 1, ForWriting = 2
    Dim fso, FileIn, Fileout, strTmp, count, Data


    Set fso = CreateObject("Scripting.FileSystemObject")
    Set FileIn = fso.OpenTextFile(logfilename, 1)
    Set Fileout = fso.CreateTextFile(file_path & textfilename, 2, True)

     If Len(Hour(Time)) = 1 Then
               Lasthour = "0" & Hour(Time) - 1
               If (Len(Lasthour) > 2) Then Lasthour = "23"
               Currenthour = "0" & Hour(Time)
            Else
               Lasthour = Hour(Time) - 1
               Currenthour = Hour(Time)
            End If

    count = 0
    Data = ""
    Do Until FileIn.AtEndOfStream
       strTmp = FileIn.ReadLine
       If Len(strTmp) > 0 Then
            If (InStr(1, strTmp, Date & " " & Lasthour, vbTextCompare) > 0) Then
                'Fileout.writeLine
                Fileout.writeLine Data & strTmp
                count = 1
                Data = ""
            ElseIf (InStr(1, strTmp, Date & " " & Currenthour, vbTextCompare) > 0) Then
                count = 2
            End If

            If (InStr(1, strTmp, Date & " " & Lasthour, vbTextCompare) < 1 And count = 1) Then
                Data = Data & vbNewLine & strTmp
                End If
        End If
    Loop

    FileIn.Close
    Fileout.Close

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

1 Ответ

0 голосов
/ 31 декабря 2018

Предположим, что входной файл журнала упорядочен по времени.Затем вы можете найти начальную позицию, откуда читать, используя двоичный поиск .Вы можете прекратить зацикливание строк, когда достигнете отметки времени, которая позже конца вашего временного окна.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...