Delen via


Procedure: Lezen uit tekstbestanden met meerdere indelingen in Visual Basic

Het TextFieldParser object biedt een manier om gestructureerde tekstbestanden, zoals logboeken, eenvoudig en efficiƫnt te parseren. U kunt een bestand met meerdere indelingen verwerken met behulp van de PeekChars methode om de indeling van elke regel te bepalen terwijl u door het bestand parseert.

Een tekstbestand met meerdere indelingen parseren

  1. Voeg een tekstbestand met de naam testfile.txt toe aan uw project. Voeg de volgende inhoud toe aan het tekstbestand:

    Err  1001 Cannot access resource.
    Err  2014 Resource not found.
    Acc  10/03/2009User1      Administrator.
    Err  0323 Warning: Invalid access attempt.
    Acc  10/03/2009User2      Standard user.
    Acc  10/04/2009User2      Standard user.
    
  2. Definieer de verwachte indeling en de indeling die wordt gebruikt wanneer een fout wordt gerapporteerd. De laatste vermelding in elke matrix is -1, daarom wordt ervan uitgegaan dat het laatste veld een variabele breedte heeft. Dit gebeurt wanneer de laatste vermelding in de matrix kleiner is dan of gelijk is aan 0.

    Dim stdFormat As Integer() = {5, 10, 11, -1}
    Dim errorFormat As Integer() = {5, 5, -1}
    
  3. Maak een nieuw TextFieldParser object en definieer de breedte en opmaak.

    Using MyReader As New FileIO.TextFieldParser("..\..\testfile.txt")
        MyReader.TextFieldType = FileIO.FieldType.FixedWidth
        MyReader.FieldWidths = stdFormat
    
  4. Loop door de rijen, test op opmaak voordat u leest.

    Dim currentRow As String()
    While Not MyReader.EndOfData
        Try
            Dim rowType = MyReader.PeekChars(3)
            If String.Compare(rowType, "Err") = 0 Then
                ' If this line describes an error, the format of the row will be different.
                MyReader.SetFieldWidths(errorFormat)
            Else
                ' Otherwise parse the fields normally
                MyReader.SetFieldWidths(stdFormat)
            End If
            currentRow = MyReader.ReadFields
            For Each newString In currentRow
                Console.Write(newString & "|")
            Next
            Console.WriteLine()
    
  5. Schrijf fouten naar de console.

            Catch ex As Microsoft.VisualBasic.
                          FileIO.MalformedLineException
                MsgBox("Line " & ex.Message & " is invalid.")
            End Try
        End While
    End Using
    

Opmerking

Hier volgt het volledige voorbeeld dat uit het bestand testfile.txtwordt gelezen:

Dim stdFormat As Integer() = {5, 10, 11, -1}
Dim errorFormat As Integer() = {5, 5, -1}
Using MyReader As New FileIO.TextFieldParser("..\..\testfile.txt")
    MyReader.TextFieldType = FileIO.FieldType.FixedWidth
    MyReader.FieldWidths = stdFormat
    Dim currentRow As String()
    While Not MyReader.EndOfData
        Try
            Dim rowType = MyReader.PeekChars(3)
            If String.Compare(rowType, "Err") = 0 Then
                ' If this line describes an error, the format of the row will be different.
                MyReader.SetFieldWidths(errorFormat)
            Else
                ' Otherwise parse the fields normally
                MyReader.SetFieldWidths(stdFormat)
            End If
            currentRow = MyReader.ReadFields
            For Each newString In currentRow
                Console.Write(newString & "|")
            Next
            Console.WriteLine()
        Catch ex As FileIO.MalformedLineException
            MsgBox("Line " & ex.Message & " is invalid.  Skipping")
        End Try
    End While
End Using
Console.ReadLine()

Robuuste programmering

De volgende voorwaarden kunnen een uitzondering veroorzaken:

  • Een rij kan niet worden geparseerd met behulp van de opgegeven indeling (MalformedLineException). In het uitzonderingsbericht wordt de regel opgegeven die de uitzondering veroorzaakt, terwijl de ErrorLine eigenschap is toegewezen aan de tekst in de regel.
  • Het opgegeven bestand bestaat niet (FileNotFoundException).
  • Een gedeeltelijke vertrouwenssituatie waarbij de gebruiker niet over voldoende machtigingen beschikt om toegang te krijgen tot het bestand. (SecurityException).
  • Het pad is te lang (PathTooLongException).
  • De gebruiker heeft onvoldoende machtigingen voor toegang tot het bestand (UnauthorizedAccessException).

Zie ook