首页 > 解决方案 > 使用 VBA 从日志文件或文本文档中提取两个字符串(时间间隔)之间的数据

问题描述

我有一个以 MB 为单位的日志文件,我只需要提取一个特定小时的数据并排除剩余的数据。

我尝试通过使用时间戳复制日志文件中的每一行来实现它,并且我可以使用它来提取数据,但是当日志文件中记录了异常时,我无法捕获它,因为它没有时间戳在所有行中。我也需要那个。

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

我已经像这样修改了代码,并且能够提取两个时间戳之间的所有数据,但是文件大小比原来的大一倍。我应该怎么办?

标签: excelvbatext-fileslogfile

解决方案


假设输入日志文件是按时间排序的。然后,您可以使用二分搜索找到要读取的起始位置。当您到达一个迟于您的时间窗口结束的时间戳时,您可以结束这些行的循环。

为了实现二进制搜索,您必须以二进制模式打开文件(打开二进制访问读取)。如果所有记录的长度相同,您可以使用get轻松读取时间戳。否则,只需使用get读取足够长的字符串并将其拆分为vbcrlf以获得单个记录。


推荐阅读