Excel 在vba中从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

使用下面的代码,我试图从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, 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”
    ,则必须相应地处理。如果只有一个实例,那么你可以使用上面的方法。我会重复那一堆行,以便处理这个案例。如果你展示一个示例,那么也许我可以给你一个更好的建议:)这都在一个文本文件或不同的文本文件中??