Вы можете сделать весь свой код более простой однострочной версией, используя File.ReadAllLines и LINQ. Этот код помещает все строки, начинающиеся с javaerror, в текстовое поле, а не только первое:
textBox.Lines = File.ReadAllLines(errorFilePath) _
.Where(Function(s) s.Trim().StartsWith("JavaError")) _
.Select(Function(t) t.Substring(t.IndexOf("= ") + 2).Replace(" & vbLf & ", Environment.NewLine)) _
.ToArray()
Вам необходимо импортировать System.IO и System.Linq
Этот код читает все строк файла в массив, затем использует LINQ для извлечения только тех, которые начинаются с ошибки java, затем проецирует новую строку всего, после того, как =
с заменой vbLf на новую строку, преобразует перечислимую проекцию в массив строк и назначает его в строки textBox
Если вы не хотите, чтобы все строки, а только только первые:
textBox.Text = File.ReadLines(errorFilePath) _
.FirstOrDefault(Function(s) s.Trim().StartsWith("JavaError")) _
?.Substring(t.IndexOf("= ") + 2).Replace(" & vbLf & ", Environment.NewLine))
Эта строка использует ReadLine вместо ReadALlLines - ReadLines работает постепенно, и имеет смысл иметь возможность прекратить чтение после того, как мы нашли его первым, вместо того, чтобы иметь лишние затраты на чтение ВСЕХ (миллионов) строк только для того, чтобы потом закончить тем, что вытащил первый и выбросил 999 999 строк усилий. Таким образом, он читает строку за строкой, извлекает первое, которое начинается с «JavaError» (или Nothing, если такой строки нет), затем проверяет, выдало ли Nothing (?
) и пропускает ли подстроку, если это было Nothing, или после =
он создает подстроку и заменяет vbLf символом новой строки
. Для прямого мода вашего исходного кода:
Using sr As System.IO.StreamReader = My.Computer.FileSystem.OpenTextFileReader(errorfilePath)
While ((sr.Peek() <> -1))
line = sr.ReadLine
If line.Trim().StartsWith("JavaError." & output) Then
isValueFound = True
line = line.Replace(" & vbLf & ", Environment.NewLine))
'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ added code
Exit While
End If
End While
sr.Close()
End Using
If isValueFound Then
Dim strArray As String() = line.Split("="c)
MsgBox(strArray(1).Replace("""", "").Trim({" "c}))
End If
Обратите внимание, что я всегда делал свою замену на & vbLf &
с пробелом на каждом конце, чтобы избежать появления случайных пробелов - если иногда в вашем файле их нет, рассмотрите возможность использования Regex для замены, например, Regex.Replace(line, " ?& vbLf & ?", Environment.NewLine