Como: Ler arquivos de texto com vários formatos de Visual Basic

O objeto TextFieldParser fornece uma maneira para facilmente e com eficiência analisar arquivos texto estruturados, como logs. Você pode processar um arquivo com vários formatos usando o método PeekChars para determinar o formato de cada linha conforme você analisa através do arquivo.

Para analisar um arquivo de texto com vários formatos

  1. Adicione um arquivo de texto chamado testfile. txt ao seu projeto. Adicione o seguinte conteúdo para o arquivo de texto.

    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. Defina o formato esperado e o formato usado quando um erro é relatado. A última entrada em cada matriz é -1, portanto o último campo será considerado de largura variável. Isso ocorre quando a última entrada na matriz é menor ou igual a 0.

    Dim stdFormat As Integer() = {5, 10, 11, -1}
    Dim errorFormat As Integer() = {5, 5, -1}
    
  3. Criar uma nova TextFieldParser o objeto, definindo a largura e o formato.

    Using MyReader As New FileIO.TextFieldParser("..\..\testfile.txt")
        MyReader.TextFieldType = FileIO.FieldType.FixedWidth
        MyReader.FieldWidths = stdFormat
    
  4. Percorra as linhas, testando seus formatos antes da leitura.

    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. Grave erros no console.

          Catch ex As Microsoft.VisualBasic.
                        FileIO.MalformedLineException
             MsgBox("Line " & ex.Message & " is invalid.")
          End Try
       End While
    End Using
    

Exemplo

Veja a seguir o exemplo completo que lê o arquivo testfile.txt.

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

Programação robusta

As seguintes condições podem causar uma exceção:

  • Uma linha não pode ser analisado usando o formato especificado (MalformedLineException). A mensagem de exceção especifica a linha causando a exceção, enquanto o ErrorLine property é atribuída ao texto contido na linha.

  • O arquivo especificado não existe (FileNotFoundException).

  • Uma situação de confiança parcial (partial-trust) na qual o usuário não tem permissões suficientes para acessar o arquivo. (SecurityException).

  • O caminho é muito longo (PathTooLongException).

  • O usuário não tem permissões suficientes para acessar o arquivo (UnauthorizedAccessException).

Consulte também

Tarefas

Como: Ler arquivos de texto delimitado por vírgula em Visual Basic

Como: Ler arquivos de texto de largura fixa no Visual Basic

Referência

Microsoft.VisualBasic.FileIO.TextFieldParser

PeekChars

MalformedLineException

WriteAllText

EndOfData

TextFieldType

Conceitos

Analisar os arquivos de texto com o objeto TextFieldParser (Visual Basic)

Histórico de alterações

Date

History

Motivo

Janeiro de 2011

Adicionadas informações sobre campos de largura variável.

Comentários do cliente.