Vorgehensweise: 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
Fügen Sie eine Textdatei mit dem Namen textfile.txt zu Ihrem Projekt hinzu. Fügen Sie folgenden Inhalt in die 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.
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}
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
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()
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
Im Folgenden 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).