Nasıl yapılır: Visual Basic'te birden çok biçime sahip metin dosyalarından okuma
TextFieldParser nesnesi, günlükler gibi yapılandırılmış metin dosyalarını kolayca ve verimli bir şekilde ayrıştırmak için bir yol sağlar. Dosyada ayrıştırdığınız her satırın biçimini belirlemek için yöntemini kullanarak PeekChars
birden çok biçime sahip bir dosyayı işleyebilirsiniz.
Birden çok biçime sahip bir metin dosyasını ayrıştırmak için
Projenize testfile.txt adlı bir metin dosyası ekleyin. Metin dosyasına aşağıdaki içeriği ekleyin:
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.
Beklenen biçimi ve hata bildirildiğinde kullanılan biçimi tanımlayın. Her dizideki son girdi -1'dir, bu nedenle son alanın değişken genişlikte olduğu varsayılır. Dizideki son girdi 0'dan küçük veya buna eşit olduğunda bu durum oluşur.
Dim stdFormat As Integer() = {5, 10, 11, -1} Dim errorFormat As Integer() = {5, 5, -1}
Genişliği ve biçimi tanımlayan yeni TextFieldParser bir nesne oluşturun.
Using MyReader As New FileIO.TextFieldParser("..\..\testfile.txt") MyReader.TextFieldType = FileIO.FieldType.FixedWidth MyReader.FieldWidths = stdFormat
Okumadan önce biçimi test eden satırlar arasında döngü yapın.
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()
Konsola yazma hataları.
Catch ex As Microsoft.VisualBasic. FileIO.MalformedLineException MsgBox("Line " & ex.Message & " is invalid.") End Try End While End Using
Örnek
Aşağıda dosyasından testfile.txt
okunan tam örnek verilmiştir:
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()
Sağlam programlama
Aşağıdaki koşullar özel bir duruma neden olabilir:
- Bir satır, belirtilen biçim (MalformedLineException ) kullanılarak ayrıştırılamaz. Özel durum iletisi özel duruma neden olan satırı belirtirken ErrorLine , özellik satırda yer alan metne atanır.
- Belirtilen dosya yok (FileNotFoundException ).
- Kullanıcının dosyaya erişmek için yeterli izinlere sahip olmadığı kısmi güven durumu. (SecurityException).
- Yol çok uzun (PathTooLongException).
- Kullanıcının dosyaya (UnauthorizedAccessException ) erişmek için yeterli izinleri yok.