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
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.
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}
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
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()
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.txt
wordt 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).