Gewusst wie: Lesen aus Textdateien mit mehreren Formaten in Visual Basic

Mit dem TextFieldParser-Objekt können strukturierte Textdateien, z. B. Protokolle, leicht und effizient analysiert werden. Sie können eine Datei mit mehreren Formaten mithilfe der PeekChars-Methode verarbeiten, um das Format der jeweiligen Zeile zu bestimmen, während Sie die Datei analysieren.

So lesen Sie aus einer Textdatei mit mehreren Formaten

  1. Fügen Sie dem Projekt eine Textdatei mit dem Namen "testfile.txt" hinzu. Fügen Sie der Textdatei folgenden Inhalt hinzu:

    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. Definieren Sie das erwartete Format und das für das Erfassen eines Fehlers verwendete Format. Der letzte Eintrag in jedem Array lautet "-1", daher wird für das letzte Feld eine variable Breite angenommen. Dies ist der Fall, wenn der letzte Eintrag im Array kleiner oder gleich 0 (null) ist.

    Dim stdFormat As Integer() = {5, 10, 11, -1}
    Dim errorFormat As Integer() = {5, 5, -1}
    
  3. Erstellen Sie ein neues TextFieldParser-Objekt, und definieren Sie Breite und Format.

    Using MyReader As New FileIO.TextFieldParser("..\..\testfile.txt")
        MyReader.TextFieldType = FileIO.FieldType.FixedWidth
        MyReader.FieldWidths = stdFormat
    
  4. Durchlaufen Sie die Zeilen, und testen Sie das Format vor dem Lesen.

    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. Geben Sie Fehler auf der Konsole aus.

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

Beispiel

Im Folgenden ist ein vollständiges Beispiel aus der Datei testfile.txt aufgeführt.

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()

Robuste Programmierung

Die folgenden Bedingungen können einen Ausnahmefehler verursachen:

  • Eine Zeile kann nicht mit dem angegebenen Format analysiert werden (MalformedLineException). In der Ausnahmemeldung wird die Nummer der Zeile angegeben, die die Ausnahme verursacht hat. Der in der Zeile enthaltene Text wird der ErrorLine-Eigenschaft zugewiesen.

  • Die angegebene Datei ist nicht vorhanden (FileNotFoundException).

  • Es besteht eine teilweise vertrauenswürdige Situation, in der der Benutzer nicht über ausreichende Berechtigungen für den Zugriff auf die Datei verfügt. (SecurityException).

  • Der Pfad ist zu lang (PathTooLongException).

  • Der Benutzer verfügt nicht über ausreichende Berechtigungen für den Zugriff auf die Datei (UnauthorizedAccessException).

Siehe auch

Aufgaben

Gewusst wie: Lesen aus durch Kommas getrennten Textdateien in Visual Basic

Gewusst wie: Lesen aus einer Textdatei mit fester Breite in Visual Basic

Referenz

Microsoft.VisualBasic.FileIO.TextFieldParser

PeekChars

MalformedLineException

WriteAllText

EndOfData

TextFieldType

Konzepte

Analysieren von Textdateien mit dem TextFieldParser-Objekt (Visual Basic)

Änderungsprotokoll

Datum

Versionsgeschichte

Grund

Januar 2011

Informationen zu Feldern mit variabler Breite wurden hinzugefügt.

Kundenfeedback.