How to: Read From Text Files with Multiple Formats in Visual Basic

 

Veröffentlicht: Juli 2016

Die neueste Dokumentation zu Visual Studio 2017 finden Sie unter Dokumentation zu Visual Studio 2017.

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
    

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

Unter den folgenden Bedingungen kann eine Ausnahme ausgelöst werden:

  • 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).

Microsoft.VisualBasic.FileIO.TextFieldParser
PeekChars
MalformedLineException
WriteAllText
EndOfData
TextFieldType
How to: Read From Comma-Delimited Text Files
How to: Read From Fixed-width Text Files
Parsing Text Files with the TextFieldParser Object

Anzeigen: