excel - 使用 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
我已经像这样修改了代码,并且能够提取两个时间戳之间的所有数据,但是文件大小比原来的大一倍。我应该怎么办?
解决方案
假设输入日志文件是按时间排序的。然后,您可以使用二分搜索找到要读取的起始位置。当您到达一个迟于您的时间窗口结束的时间戳时,您可以结束这些行的循环。
为了实现二进制搜索,您必须以二进制模式打开文件(打开二进制访问读取)。如果所有记录的长度相同,您可以使用get轻松读取时间戳。否则,只需使用get读取足够长的字符串并将其拆分为vbcrlf以获得单个记录。
推荐阅读
- python - 语法 Keras 层定义
- php - 会话处于活动状态时,Devilbox pgMyAdmin 错误无法更改会话名称
- java - 当用户未使用远程桌面登录时,无法运行 powershell.exe 并使用 Invoke-WmiMethod 执行 ps1 文件
- gradle - 如何防止 gradle 任务覆盖由调用 groovy 类创建文件的自定义任务创建的文件
- swift - Swift:自定义注释丢失字幕
- django-forms - 如何使用 Crispy 表单将 action 和 novalidate 属性添加到表单标签
- android - 如何为 viewPager2 设置适配器
- angular - Angular:仅允许通过模板访问组件成员
- python-3.x - 如何使用 django restframework 构建 django 模板
- google-cloud-platform - 使用自定义预测例程时没有这样的文件或目录:'/tmp/model/0001' google cloud ai platform