(VB.NET) отобразить нижнюю половину текстового файла в список - PullRequest
0 голосов
/ 20 апреля 2019

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

Текстовый файл:

 # School [School Code|School Name|Coach F-Name|Coach L-Name|AD F-Name|AD L Name]
 WSHS|Worcester South High School|Glenn|Clauss|Bret|Zane
 WDHS|Worcester Dorehty High School|Ellsworth|Quackenbush|Bert|Coco
 WBCHS|Worcester Burncoat High School|Gail|Cain|Kevin|Kane
 QRHS|Quabbin Regional High School|Bob|Desilets|Seth|Desilets  
 GHS|Gardner High School|Jack|Smith|George|Fanning   
 NBHS|North Brookfield High School|Hughe|Fitch|Richard|Carey
 WHS|Winchendon High School|Bill|Nice|Sam|Adams
 AUBHS|Auburn High School|Katie|Right|Alice|Wonderland
 OXHS|Oxford High School|Mary|Cousin|Frank|Daughter
 # Roster [Bib #|School Code|Runner's F-Name|Runner's L-Name]
 101|WSHS|Sanora|Hibshman
 102|WSHS|Bridgette|Moffitt
 103|WSHS|Karine|Chunn
 104|WSHS|Shanita|Wind
 105|WSHS|Fernanda|Parsell
 106|WSHS|Albertha|Baringer
 107|WSHS|Carlee|Sowards
 108|WDHS|Maisha|Kleis
 109|WDHS|Lezlie|Berson
 110|WDHS|Deane|Rocheleau
 111|WDHS|Hang|Hodapp
 112|WDHS|Zola|Dorrough
 113|WDHS|Shalon|Mcmonigle

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

Мой код:

   Private Sub btnLoadTeams_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoadTeam.Click
    ' This routine loads the lstTeam box from an ASCII .txt file
    ' # School [School Code | Name | Coach F-Name| Coach L-Name | AD F-Name | AD L-Name]

    Dim strRow As String
    Dim bolFoundCode As Boolean = False
    Dim bolEndCode As Boolean = False
    Dim bolFoundDup As Boolean = False
    Dim intPosition As Integer
    Dim intPosition2 As Integer
    Dim strTeamCodeIn As String
    Dim textIn As New StreamReader( _
        New FileStream(txtFilePath.Text, FileMode.OpenOrCreate, FileAccess.Read))
    ' Clear Team listbox
    lstTeam.Items.Clear()
    btnDeleteRunner.Enabled = True

    Do While textIn.Peek <> -1 And Not bolEndCode
        Me.Refresh()
        strRow = textIn.ReadLine.Trim
        If Not bolFoundCode Then
            If "# SCHOOL " = UCase(Mid(strRow, 1, 9)) Then
                bolFoundCode = True
            End If
        Else
            If Mid(strRow, 1, 2) <> "# " Then
                For Each item As String In lstTeam.Items
                    intPosition = InStr(1, strRow, "|")
                    strTeamCodeIn = Mid(strRow, 1, intPosition - 1)
                    intPosition2 = InStr(1, item, strTeamCodeIn)

                    If intPosition2 > 0 Then
                        bolFoundDup = True
                        MsgBox("Found Duplicate School Code: " & strTeamCodeIn)

                    End If
           Else
               bolEndCode = True
                Next

                If Not bolFoundDup Then
                    lstTeam.Items.Add(strRow)

                Else
                    lstTeam.Items.Add("DUPLICATE School Code: " & strRow)
                    lstTeam.Items.Add("Please correct input file and reload teams")
                    bolEndCode = True
                End If
            End If
        End If
    Loop

End Sub

Ive поместил bolEndCode = True между частью, которая читает среднюю часть текстового файла, но все, что мне удалось отобразить, - это следующее в списке:

 # Roster [Bib #|School Code|Runner's F-Name|Runner's L-Name]

Буду очень признателен за любую помощь или подсказки о том, как я буду отображать только бегунов в моем списке "lstPlayers". Я начинающий программист, и мы только начали изучать чтение и запись массивов в моем классе .NET.

1 Ответ

0 голосов
/ 21 апреля 2019

Сначала я сделал 2 класса, один бегун и одну школу. У них есть свойства, доступные в текстовом файле. Как часть класса я добавил функцию, которая переопределяет .ToString. Это для списков, которые вызывают .ToString для отображения.

Далее я сделал функцию, которая читает все данные в файле. Это очень просто с помощью метода File.ReadLines.

Затем я создал 2 переменные List (Of T) T обозначает тип. Наши Типы - Бегун и Школа. Я использовал List (Of T) вместо массивов, потому что мне не нужно беспокоиться о размере списка. Нет ReDim Preserve, просто продолжайте добавлять элементы. Метод FillList добавляет данные в списки. Сначала я должен был найти, где заканчиваются школы и бегуны. Я использовал метод Array.FindIndex, который немного отличается, поскольку второй параметр является предикатом. Проверьте это немного. Теперь мы знаем индексы строк, которые мы хотим использовать для каждого списка, и используем цикл For ... Next. В каждом цикле создается экземпляр класса и устанавливаются свойства. Наконец новый объект добавляется в список.

Наконец, мы заполняем списки с помощью простого .AddRange и lists.ToArray. Обратите внимание, что мы добавляем весь объект, свойства и все. Удобно то, что мы можем получить доступ к свойствам из элементов списка. Проверьте событие SelectedIndexChanged. Вы можете сделать то же самое со списком Runner.

Извините, я не могу просто работать с вашим кодом. Я почти забыл старые методы vb6. InStr, Mid и т. Д. Лучше использовать методы .net. Это делает ваш код более переносимым, когда начальник говорит: «Перепишите все приложение на C #»

Public Class Runner
    Public Property BibNum As Integer
    Public Property SchoolCode As String
    Public Property FirstName As String
    Public Property LastName As String
    Public Overrides Function ToString() As String
        'The listbox will call .ToString when we add a Runner object to determin what to display
        Return $"{FirstName} {LastName}" 'or $"{LastName}, {FirstName}"
    End Function
End Class

Public Class School
    Public Property Code As String
    Public Property Name As String
    Public Property CoachFName As String
    Public Property CoachLName As String
    Public Property ADFName As String
    Public Property ADLName As String

    'The listbox will call .ToString when we add a School object to determin what to display
    Public Overrides Function ToString() As String
        Return Name
    End Function

End Class

Private Runners As New List(Of Runner)
Private Schools As New List(Of School)
Private Function ReadData(path As String) As String()
    Dim lines = File.ReadLines(path).ToArray
    Return lines
End Function

Private Sub FillLists(data As String())
    Dim location = Array.FindIndex(data, AddressOf FindRosterLine)
    'The first line is the title so we don't start at zero
    For index = 1 To location - 1
        Dim SplitData = data(index).Split("|"c)
        Dim Schl As New School
        Schl.Code = SplitData(0)
        Schl.Name = SplitData(1)
        Schl.CoachFName = SplitData(2)
        Schl.CoachLName = SplitData(3)
        Schl.ADFName = SplitData(4)
        Schl.ADLName = SplitData(5)
        Schools.Add(Schl)
    Next
    For index = location + 1 To data.GetUpperBound(0)
        Dim SplitData = data(index).Split("|"c)
        Dim Run As New Runner
        Run.BibNum = CInt(SplitData(0))
        Run.SchoolCode = SplitData(1)
        Run.FirstName = SplitData(2)
        Run.LastName = SplitData(3)
        Runners.Add(Run)
    Next
End Sub

Private Function FindRosterLine(s As String) As Boolean
    If s.Trim.StartsWith("# Roster") Then
        Return True
    Else
        Return False
    End If
End Function

Private Sub FillListBoxes()
    Dim arrRunners As Runner() = Runners.ToArray
    Dim arrSchools As School() = Schools.ToArray
    ListBox1.Items.AddRange(arrSchools)
    ListBox2.Items.AddRange(arrRunners)
End Sub

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim arrRunner = ReadData("Runners.txt")
    FillLists(arrRunner)
    FillListBoxes()
End Sub

Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged
    Dim Schl = DirectCast(ListBox1.SelectedItem, School)
    TextBox1.Text = Schl.CoachLName
    TextBox2.Text = Schl.Code
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...