Извлечение определенных строк после найденной строки из файла - PullRequest
0 голосов
/ 25 июня 2019

Я хочу извлечь строки 6, 9 и 12 после того, как строка найдена в определенной строке в файле.Здесь строка поиска: output name = "BoundingBox"> .В одном файле может быть несколько экземпляров, поэтому я хочу повторить одно и то же.

Ниже приведен код, который извлекает все строки после того, как найдена строка.

Данные файла:

  ...
  <output name="BoundingBox">
   <struct type="BoundingBox">
  <output name="BottomLeftCorner">
   <struct type="BottomLeftCorner">
  <elem name="X">
    <object type="double" value = "351.8340105482794">
  </elem>
  <elem name="Y">
    <object type="double" value = "319.5377197265625">
  </elem>
  <elem name="Z">
    <object type="double" value = "0">
  </elem>
   </struct>
  </output>
  <output name="TopRightCorner">
   <struct type="TopRightCorner">

Код:

Sub test()
Dim fn As String, txt As String, mySearch As String, x, y
fn = "D:\workdir\Autotest--new.xml"
txt = CreateObject("Scripting.FileSystemObject").OpenTextFile(fn).ReadAll
'mySearch = InputBox("Enter search string")
x = InStr(1, txt, "output name=""BoundingBox"">", 1)
If x = 0 Then
    MsgBox "No match"
    Exit Sub
Else
    txt = Mid$(txt, x)
    y = Split(txt, vbCrLf)
    Cells(1, 1).Resize(UBound(y) + 1).Value = Application.Transpose(y)
End If
End Sub

1 Ответ

1 голос
/ 25 июня 2019

Я бы использовал Open fn For Input As #1 и перебрал бы строки с Line Input #1, textline, затем проверил бы, присутствует ли строка, и сосчитал следующие строки.Сохраните все, что нужно.Не забудьте закрыть файл с помощью Close #1

Sub test()
    Dim fn As String, txt As String, mySearch As String, x, y
    fn = "D:\workdir\Autotest--new.xml"
    Open fn For Input As #1
    Do Until EOF(1)
        Line Input #1, textline
        If InStr(1, textline, "output name=""BoundingBox"">", 1) > 0 Then
            For i = 1 To 12
                Line Input #1, textline
                Select Case i
                    Case 5
                        Cells(1, 1) = extract_value(textline)
                    Case 8
                        Cells(1, 2) = extract_value(textline)
                    Case 11
                        Cells(1, 3) = extract_value(textline)
                    Case Else
                        'Ignore
                End Select
            Next
        End If
    Loop
    Close #1
End Sub

, где следующая функция извлекает двойное значение из текстовой строки.

Function extract_value(ByVal textline As String) As Double
    startIndex = InStr(1, textline, "value = """) + 9
    endIndex = InStr(startIndex, textline, """")
    strVal = Mid(textline, startIndex, endIndex - startIndex)
    'strVal = Replace(strVal, ".", ",") 'use this if you have "," as your decimal separator
    extract_value = CDbl(strVal)
End Function

Этот код не проверен, потому что я неу вас нет полного файла ваших экземпляров.

Далее, я бы порекомендовал взглянуть на анализатор XML, если вы имеете дело с файлами XML: http://dailydoseofexcel.com/archives/2009/06/16/reading-xml-files-in-vba/

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