#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)
...
Я застрял и не знаю, как продолжить кодирование (изменить код, как я сказал выше).
Программа должна быть чем-то вроде:
- Найдите слово » <span>Значение <br>»</span>
- Показать в 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
Это также может значительно сократить использование оперативной памяти, поскольку одновременно в памяти всегда находится только одна строка из файла.
Вот краткое доказательство того, что это работает:
Но также похоже, что вы также не уверены в этой 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
.