Excel 在vba中从syslog文件提取数据
使用下面的代码,我试图从syslog文件中提取一行字符串Excel 在vba中从syslog文件提取数据,excel,vba,Excel,Vba,使用下面的代码,我试图从syslog文件中提取一行字符串原始值,但我得到的是整个文件数据作为输出 Sub test() Dim InputData ' Open file for input. Open "D:\temp\DraftTest3_pmi_jt_import_All_Annotations.syslog" For Input As #1 Do While Not EOF(1) ' Check for end of file. Line Input #1, InputDa
原始值
,但我得到的是整个文件数据作为输出
Sub test()
Dim InputData
' Open file for input.
Open "D:\temp\DraftTest3_pmi_jt_import_All_Annotations.syslog" For Input As #1
Do While Not EOF(1) ' Check for end of file.
Line Input #1, InputData ' Read line of data.
Debug.Print InputData ' Print to the Immediate window.
If InStr(1, InputData, "original value") Then
Cells(2, 3).Value = InputData ''' Print a line in cell
InputData = ""
End If
Loop
Close #1 ' Close file.
End Sub
系统日志内容:
Nodes differ : original value 189.1596739640256
new value 191.1200796864099
Difference:
<object type="NXOpen.ValidationAnnotation3DCollectionValidator" value="None" xml_line_number="14" />
<context line_number="132" variable_name="validationAnnotation3DCollectionValidator1" xml_line_number="15" />
<object type="NXOpen.ValidationWeldValidator" value="None" xml_line_number="2675" />
<context line_number="0" variable_name="" xml_line_number="2676" />
<output name="WeldReferenceLineLength" xml_line_number="2677" />
<object tolerance="1e-06" tolerance_type="absolute" type="double" value="189.1596739640256" />
*** changed to ***
<object tolerance="1e-06" tolerance_type="absolute" type="double" value="191.1200796864099" xml_line_number="2678" />
_________________________________________________________________________________________
Nodes differ : original value 102.5546050485778
new value 102.8898888970786
Difference:
<object type="NXOpen.ValidationAnnotation3DCollectionValidator" value="None" xml_line_number="14" />
<context line_number="132" variable_name="validationAnnotation3DCollectionValidator1" xml_line_number="15" />
<object type="NXOpen.ValidationWeldValidator" value="None" xml_line_number="4422" />
<context line_number="0" variable_name="" xml_line_number="4423" />
<output name="WeldReferenceLineLength" xml_line_number="4424" />
<object tolerance="1e-06" tolerance_type="absolute" type="double" value="102.5546050485778" />
节点不同:原始值189.1596739640256
新值191.1200796864099
区别:
***改为***
_________________________________________________________________________________________
节点不同:原始值102.5546050485778
新值102.8898888970786
区别:
期望输出:
InStr返回一个变量,而不是布尔值。如果InStr(…)>0,请尝试将比较更改为
。文档位于
我还注意到,您依次用每个值覆盖单个单元格。如果要保存所有值,则需要更改为单元格编制索引的方式
编辑行输入
无法处理Unix类型的文本文件(仅限LF行结尾)。参见,例如。试试下面的答案。简而言之,您必须读取整个文件(您已经这样做了:),然后在vbLf
上拆分它以获得单独的行
是否要提取值189.1596739640256?-西德哈特路7分钟前
对。我想要那个值实验者6分钟前
获得该值的最快方法是
一次性打开并读取文本文件。i、 没有循环的循环
在原始值上拆分
然后在新值上拆分
代码:
Option Explicit
Sub Sample()
Dim MyData As String, ValueNeeded As String
'~~> Change this to the relevant file
'~~> Read the entire file in a variable in ONE GO
Open "C:\Users\routs\Desktop\Sample.Txt" For Binary As #1
MyData = Space$(LOF(1))
Get #1, , MyData
Close #1
ValueNeeded = Trim(Split(MyData, "original value")(1))
ValueNeeded = Trim(Split(ValueNeeded, "new value")(0))
Debug.Print ValueNeeded
End Sub
屏幕截图
编辑
要合并最近编辑中显示的多个实例,必须查找唯一的单词。在您的情况下,可能是节点不同:
。为什么会这样?因为这意味着一个新的部分。因此,逻辑将是在节点上拆分不同的节点:
,然后在原始值
、新值
和差异:
看这个例子
Option Explicit
Sub Sample()
Dim MyData As String, ValueString As String
Dim orgVal As String, newVal As String
Dim strData() As String
Dim i As Long
'~~> Change this to the relevant file
'~~> Read the entire file in a variable in ONE GO
Open "C:\Users\routs\Desktop\test.Txt" For Binary As #1
MyData = Space$(LOF(1))
Get #1, , MyData
Close #1
'~~> Split on "Nodes differ :" to identify separate sections
'~~> Store them in an array
strData() = Split(MyData, "Nodes differ :")
'~~> Loop though each section and split on relevant identifiers
'~~> to get the necessary value
For i = LBound(strData) + 1 To UBound(strData)
ValueString = Trim(Split(strData(i), "original value")(1))
orgVal = Trim(Split(ValueString, "new value")(0))
newVal = Trim(Split(ValueString, "new value")(1))
newVal = Trim(Split(newVal, "Difference:")(0))
Debug.Print "Original Value: " & Trim(orgVal)
Debug.Print "New Value: " & Trim(newVal)
Next i
End Sub
注意:我没有做任何错误处理。我相信你会注意到…InStr返回一个变量,而不是布尔值-我想你需要如果InStr(…)>0
如果InStr(1,InputData,“原始值”)>0,那么
相同的输出。好的-你说“将整个文件数据作为输出”是什么意思?您仍将在调试控制台上看到每一行,因为打印不在If中。查看单元格中的全部内容。是否提取值189.1596739640256
?以便我可以在任何行使用它并从行中提取任何字符串?如果没有重复查找值,则为“是”。例如,如果有两行文字“original value”
,则必须相应地处理。如果只有一个实例,那么你可以使用上面的方法。我会重复那一堆行,以便处理这个案例。如果你展示一个示例,那么也许我可以给你一个更好的建议:)这都在一个文本文件或不同的文本文件中??