Найдите определенную строку из файла и прочитайте слово под ней

#vb.net

#vb.net

Вопрос:

Я написал этот код, который в данный момент считывает строку ‘ <span>Значение<br>’ из «</span>file.txt » и я хочу изменить его, чтобы найти вышеупомянутую строку и прочитать слово под ней, в данном случае «753921».

 Dim TextFile = IO.File.ReadAllText("file.txt")
Dim Find As String = "<span class=""label"">The Value</span><br>"
If TextFile.Contains(Find) Then
    MsgBox(Find)
Else
    MsgBox("Not Found")
End If
  

Файл «file.txt » содержит:

 ...
<span class="label">The Value</span><br>
753921 (it the value varies)
...
  

Я застрял и не знаю, как продолжить кодирование (изменить код, как я сказал выше).

Программа должна быть чем-то вроде:

  1. Найдите слово » <span>Значение <br>»</span>
  2. Показать в MsgBox слово в следующей строке (слово ниже найденного) — 753921

Значение и строки будут отличаться, и я не могу искать значение по строкам. Поскольку значение отличается, я не могу искать его напрямую, вот почему я подумал, что это должно быть написано только в коде, и я не знаю как, вот почему я разместил здесь. Значение всегда будет располагаться под искомым словом » <span>Значение <br>»</span>.

Я надеюсь, вы поняли, что я имел в виду, и я надеюсь, что есть кто-то, кто может мне помочь.

Комментарии:

1. Текстовый файл — это одна длинная строка, в которой могут быть или не быть символы разрыва строки. В вашем случае проще использовать File.ReadAllLines() метод, который дает вам массив со всеми строками в файле.

2. Что вам нужно сделать, это найти индекс строки, где бы вы First Line ни находились, а затем вернуть значение с индексом 1.

3. Строки будут отличаться. также есть несколько слов, и, чтобы дать им прямое указание, это не работает, вот почему я хочу создать эту программу. Искомое слово всегда имеет в следующей строке (под ним) нужное мне слово.

4. Программа найдет » <span>Значение <br>»</span> в file.txt а под ним (в следующей строке) указано значение, например 8402683 (которое меня ется). Я хочу, чтобы программа нашла искомое слово и отобразила в msgbox слово в следующей строке (в данном случае значение 840 2683). Надеюсь, вы понимаете, что я имею в виду

5. И вы хотите сказать, что вам может потребоваться найти более одной строки в файле одновременно?

Ответ №1:

Вот базовый код:

 Dim Find As String = "<span class=""label"">The Value</span><br>"
Dim result As String = 
    File.ReadLines("file.txt").
        SkipWhile(Function(line) line <> Find).
        Skip(1).
        FirstOrDefault()

If result Is Nothing Then 
    MsgBox("Not Found")
Else
    MsgBox(result)
End If
  

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

Вот краткое доказательство того, что это работает:

https://dotnetfiddle.net/OI5D0h

Но также похоже, что вы также не уверены в этой The Value части. В этом случае:

 
Dim FindTemplate As String = "<span class=""label"">{0}</span><br>"
Dim Find As String = String.Format(FindTemplate, "The Value")

Dim result As String = 
    File.ReadLines("file.txt").
        SkipWhile(Function(line) line <> Find).
        Skip(1).
        FirstOrDefault()

If result Is Nothing Then 
    MsgBox("Not Found")
Else
    MsgBox(result)
End If
  

Ответ №2:

Если под «Значение и строки будут отличаться» вы подразумеваете, что для поиска требуется более одного элемента, то простой способ сделать это — иметь список строк, которые запускают захват следующей строки.

Как только триггерная строка найдена, просто прочитайте следующую строку (если она есть) и сохраните ее.

Итак, учитывая некоторый файл «C:tempfile.txt » (важно всегда указывать полный путь к файлу в программе, чтобы вы знали, какой файл он использует):

 ...
<span class="label">The Value</span><br>
753921 (it the value varies)
...
abc
9876
nothing here
<span class="label">The Value</span><br>
111111 (it's a different value)
<span class="label">The Value</span><br>
  

и программа:

 Imports System.IO

Module Module1

    Sub Main()
        Dim myFile = "C:tempfile.txt"

        Dim triggers As New List(Of String) From {"abc", "<span class=""label"">The Value</span><br>"}

        Dim results As New List(Of String)

        Using sr As New StreamReader(myFile)
            While Not sr.EndOfStream
                Dim thisLine = sr.ReadLine()
                If triggers.IndexOf(thisLine) >= 0 Then
                    If Not sr.EndOfStream Then
                        Dim nextLine = sr.ReadLine()
                        results.Add(nextLine)
                    End If
                End If
            End While
        End Using

        Console.WriteLine(String.Join(vbCrLf, results))

        Console.ReadLine()

    End Sub

End Module
  

Вы получите вывод:

 753921 (it the value varies)
9876
111111 (it's a different value)
  

Если бы триггеров было много, то стоило бы потратить некоторое время на поиск более эффективного способа их обнаружения, чем IndexOf .