VB.net Считывает определенные строки из текстового файла, которые начинаются с и прекращают чтение, когда начинаются с

#vb.net #datagridview #text-files #file.readalllines

#vb.net #DataGridView #текстовые файлы #file.readalllines

Вопрос:

Я хочу прочитать строки из текстового файла, которые начинаются с определенных символов и останавливаются, когда строка начинается с других символов. Итак, в моем примере я хотел бы начать чтение со строки AB и остановиться на строке EF, однако не все строки будут содержать строку CD. Всегда будут строки AB и EF, однако количество строк между ними неизвестно.

Вот пример строк в текстовом файле, который я буду читать. Вы можете видеть, что это создаст две строки в DataGridView, однако в первой строке отсутствует строка CD и она должна быть пустой.

 AB-id1
EF-address1
AB-id2
CD-name1
EF-address2
  

Вот код, который у меня есть до сих пор:

   Dim lines() As String = File.ReadAllLines(textfile)
    For i As Integer = 0 To lines.Length - 1
            If lines(i).StartsWith("AB") Then
            Dim nextLines As String() = lines.Skip(i   1).ToArray
            
            Dim info As String = nextLines.FirstOrDefault(Function(Line) Line.StartsWith("CD"))
            Dim name As String = "Yes"
            
            Dim info2 As String = nextLines.FirstOrDefault(Function(Line) Line.StartsWith("EF"))
            Dim address As String = "Yes"
            End If

            DataGridView.Rows.Add(name,address)
    Next 
  

Теперь результат, который я получаю в настоящее время:

 |Yes|Yes|
|Yes|Yes|
  

И я должен получать:

 ||Yes|
|Yes|Yes|
  

Похоже, что он читает слишком далеко вниз по текстовому файлу, и мне нужно, чтобы он прекратил чтение в EF. Я пробовал Do while и Do Until, но безуспешно. Есть предложения?

Ответ №1:

Вы могли бы использовать массив.Функция findIndex для получения индекса следующей строки, начинающейся с вашего префикса. Таким образом, вам не нужно пропускать строки и каждый раз создавать новый массив.

Попробуйте это вместо:

 Dim lines() As String = File.ReadAllLines(textFile)
For i As Integer = 0 To lines.Length - 1
    If lines(i).StartsWith("AB") Then
        Dim addressIndex As Integer = Array.FindIndex(lines, i   1, Function(Line) Line.StartsWith("EF"))
        Dim address As String = If(addressIndex <> -1, lines(addressIndex).Substring(3), "") ' Get everything past the "-"

        Dim name As String = ""
        If addressIndex <> -1 Then
            Dim nameIndex As Integer = Array.FindIndex(lines, i   1, addressIndex - i, Function(line) line.StartsWith("CD"))
            If nameIndex <> -1 Then
                name = lines(nameIndex).Substring(3) ' Get everything past the "-"
            End If
        End If

        DataGridView.Rows.Add(name, address)
    End If
Next
  

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

1. У меня все та же проблема. Если строка CD не существует, она просто копирует данные с первого увиденного компакт-диска. Если вы используете мой пример, данные с этим name1 появятся дважды.

2. Ah…so сначала нам нужно выполнить поиск «EF», а затем использовать перегрузку, которая позволяет вам дать старт / стоп для последующего поиска «CD». Обновит код.

3. Да, в основном я хочу начать поиск в каждой строке, которая начинается с AB и останавливается на строке EF.