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

  1. 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.
    
  2. 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}
    
  3. 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
    
  4. 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()
    
  5. 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.txtokunan 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:

Ayrıca bkz.