Подсчет количества имен после определенного имени из файла?

#vb.net

#vb.net

Вопрос:

Я пытаюсь написать программу, которая будет подсчитывать количество имен после слова «Патти» из файла.

 Private Sub btnP_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnP.Click
    Dim inFile As StreamReader = New StreamReader("pattiparty.txt")
    'Declare the varibles
    Dim variableName As String ' the current names from the file
    Dim names As String
    Do
        'read in the names
        variableName = inFile.ReadLine()
        'determine the two consecutive names after Patti
        If variableName = "Patti" Then
            names = variableName   2
        End If
    Loop Until variableName = "Patti"
    'the loop keeps going until "Patti" is read

    'output the results
    Me.lblOutput.Text = names

End Sub
  

Конечный класс

Вместо этого программа должна отображать два имени после имени «Патти», но вместо этого я получаю сообщение об ошибке.

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

1. Вы не предоставили образец входного файла, который должен воспроизводить это поведение.

2. Включите Option Strict On на уровне проекта…

3. Предоставьте образец входного файла, а другой показывает, какими должны быть результаты.

Ответ №1:

Итак, вы захотите продолжить цикл до тех пор, пока не будет прочитана как а) целевая строка «Patti», так и б) будут прочитаны следующие 2 строки или достигнут конец файла. После распознавания имени «Патти» вы можете установить флаг foundName = true и для каждой следующей строки увеличивать количество дополнительных прочитанных имен, пока не будут прочитаны оба или не будет достигнут конец строки.

Ответ №2:

С variableName = inFile.ReadLine() помощью, вы считываете строковое значение, таким образом, с помощью: names = variableName 2 , вы пытаетесь добавить Integer значение 2 к строковому значению. Нет действительно полезного.

Вам нужно прочитать каждую строку файла и начать добавлять строковые значения в переменную / коллекцию, когда будет найден определенный шаблон. Затем решите, сколько еще строк нужно прочитать из файла.
Итак, это: Loop Until variableName = "Patti" не поможет, вы выйдете из цикла, как только скороговорка будет найдена, и вы никогда не получите следующие строки.

Конечно, тем временем вы, возможно, достигли конца файлового потока. Или, возможно, указанный вами шаблон не был найден.

Простое решение — использовать логические флаги, значение которых устанавливается True , как только шаблон найден, а затем собирать указанное количество строк, если таковые имеются, только тогда, когда установлен флаг True . Выйдите из цикла, когда соберете то, что было запрошено.
Это While Not (reader.EndOfStream) условие гарантирует, что мы не будем читать дальше конца потока.

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

 Private Sub btnP_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnP.Click
    Dim pattiResults = FileGetLines("pattiparty.txt", "Patti", 2)
    Me.lblOutput.Text = String.Join(" ", pattiResults)
End Sub

Friend Function FileGetLines(filePath As String, searchPatter As String, linesCount As Integer) As List(Of String)
    Dim patternFound As Boolean = False
    Dim result As New List(Of String)

    Using reader As StreamReader = New StreamReader(filePath)
        While Not (reader.EndOfStream)
            If reader.ReadLine().Contains(searchPatter) Then patternFound = True
            If patternFound Then
                result.Add(reader.ReadLine())
                If result.Count = linesCount Then
                    Exit While
                End If
            End If
        End While
    End Using
    Return result
End Function