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

Das TextFieldParser-Objekt bietet eine Möglichkeit, strukturierte Textdateien wie Protokolle einfach und effizient zu analysieren. Sie können eine Datei mit mehreren Formaten verarbeiten, indem Sie die PeekChars-Methode verwenden, um das Format jeder Zeile zu bestimmen, während Sie eine Datei analysieren.

Analysieren einen Textdatei mit mehreren Formaten

  1. Fügen Sie eine Textdatei mit dem Namen „textfile.txt“ in Ihrem Projekt hinzu. Fügen Sie folgenden Inhalt in der Textdatei ein.

    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 Format, das verwendet werden soll, wenn ein Fehler gemeldet wird. Der letzte Eintrag in jedem Array ist -1. Deshalb wird davon ausgegangen, dass das letzte Feld von variabler Breite ist. Dies tritt auf, wenn der letzte Eintrag des Arrays weniger 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, das die Breite und das Format definiert.

    Using MyReader As New FileIO.TextFieldParser("..\..\testfile.txt")
        MyReader.TextFieldType = FileIO.FieldType.FixedWidth
        MyReader.FieldWidths = stdFormat
    
  4. Gehen Sie durch die Reihen, und prüfen Sie vor dem Lesen das Format.

    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. Schreiben Sie Fehler in die Konsole.

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

Beispiel

Unten stehend finden Sie das vollständige Beispiel, das aus der testfile.txt-Datei liest.

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

Stabile Programmierung

Die folgenden Bedingungen können einen Ausnahmefehler verursachen:

  • Eine Zeile kann nicht mit dem angegebenen Format analysiert werden (MalformedLineException). Die Ausnahmemeldung gibt die Zeile an, die die Ausnahme verursacht, während der in der Zeile enthaltene Text der ErrorLine-Eigenschaft zugewiesen wird.

  • Die angegebene Datei ist nicht vorhanden (FileNotFoundException).

  • Eine teilweise vertrauenswürdige Situation, in der der Benutzer nicht über ausreichende Berechtigungen für den Dateizugriff verfügt. (SecurityException).

  • Der Pfad ist zu lang (PathTooLongException).

  • Der Benutzer hat keine ausreichende Berechtigungen für den Dateizugriff (UnauthorizedAccessException).

Siehe auch

Microsoft.VisualBasic.FileIO.TextFieldParser
PeekChars
MalformedLineException
WriteAllText
EndOfData
TextFieldType
Gewusst wie: Lesen aus durch Kommas getrennten Textdateien
Gewusst wie: Lesen aus einer Textdatei mit fester Breite
Analysieren von Textdateien mit dem TextFieldParser-Objekt