VB .NET -  Lendo arquivos delimitados - CSV - Usando TextFieldParser

Neste artigo veremos como acessar e realizar o parse de arquivos CSV usando o objeto TextFieldParser que fornece uma maneira fácil e eficiente de realizar o parse em arquivos textos estruturados. A classe esta presente no namesapace Microsoft.VisualBasic.FileIO.
Comma-separated values (ou CSV) é um formato de arquivo que armazena dados tabelados, cujo grande uso data da época dos mainframes. Por serem bastante simples, arquivos .csv são comuns em todas as plataformas de computador.

O CSV é um implementação particular de arquivo texto separados por um delimitador, que usa a vírgula e a quebra de linha para separar os valores. O formato também usa as aspas em campos no qual são usados os caracteres reservados (vírgula e quebra de linha). Essa robustez no formato torna o CSV mais amplo que outros formatos digitais do mesmo segmento.(http://pt.wikipedia.org/wiki/Comma-separated_values)

Exemplo de um arquivo CSV:

Arquivo Agenda de contatos
1979, Macoratti, São Paulo, SP. 125500
1980, Jose Carlos, Rio De Janeiro, RJ, 210125
1992, Ana Maria, Marilia, SP , 134525
2000, Janice , Parana, PR, 789452

O objeto TextFieldParser fornece métodos e propriedades para analisar arquivos de texto estruturados. Realizar o parse(a análise) de uma arquivo texto usando TextFieldParser é semelhante a iterar sobre o arquivo, enquanto o método ReadFields usado para extrair campos do texto é similar à função split().

O objeto TextFieldParser pode realizar o parse em dois tipos de arquivos textos:

  1. Arquivos textos delimitados
  2. Arquivos textos de tamanho fixo

Para definir se o arquivo o arquivo é delimitado ou de tamanho fixo usamos a propriedade TextFiedlType.

As propriedades Delimiters e HasFieldsEnclosedInQuotes só fazem sentidos se usadas em arquivos delimitados enquanto que a propriedade FieldWidths só tem sentido se usada em arquivos tamanho fixo.

Objetivos

Neste artigo veremos como acessar e realizar o parse em arquivos textos usando a classe TextFieldParser.

Recursos usados:

Criando o projeto para análise de arquivos delimitados

Abra o Visual Studio 2013 Express for Windows Desktop e clique em New Project;

Selecione a linguagem Visual Basic  e o template Windows Forms Application e informe o nome Usando_TextFieldParser;

Para acessar e realizar o parse de arquivos textos delimitados podemos fazer assim:

Vejamos um exemplo de acesso e parse de um arquivo delimitado.

No formulário form1.vb do projeto vamos incluir os seguintes controles:

Disponha os controles conforme o leiaute da figura abaixo:


O arquivo texto delimitado que iremos acessar se encontra na pasta c:\dados com o nome Clientes.csv e tem o seguinte conteúdo:

 

 

Note que o arquivo possui um cabeçalho, uma linha de comentário iniciada pelo caractere #, e que o cliente Tiago possui dois emails envoltos entre aspas.

 

No formulário form1.vb vamos também declarar os namespaces usados no projeto:


Imports Microsoft.VisualBasic.FileIO

No evento Click do botão de comando btnLerCSV vamos definir o código abaixo que realizar o parse do arquivo delimitado:
 

Private Sub btnLerCSV_Click(sender As Object, e As EventArgs) Handles btnLerCSV.Click
      If String.IsNullOrWhiteSpace(txtArquivoCSV.Text) Then
            MessageBox.Show("Informe o caminho e nome do arquivo Texto...")
            Return
      Else
        Using leitorArquivoCSV As New TextFieldParser(txtArquivoCSV.Text)
            'define o tipo de arquivo como delimitado
            leitorArquivoCSV.TextFieldType = FileIO.FieldType.Delimited
            'define o delimitador usado no arquivo
            leitorArquivoCSV.SetDelimiters(",")
            'Define o caractere que indica que a linha é um comentário
            leitorArquivoCSV.CommentTokens = New String() {"#"}
            ''Informa que existe um campo que esta envolto em aspas duplas (")
            leitorArquivoCSV.HasFieldsEnclosedInQuotes = True
            'define um array de string
            Dim linhaAtual As String()
               'pula a primeira linha do arquivo 
             leitorArquivoCSV.ReadLine()
            'inicia o laço para iterar no arquivo texto
            While Not leitorArquivoCSV.EndOfData
                Try
                    'le uma linha do arquivo
                    linhaAtual = leitorArquivoCSV.ReadFields()
                    Dim campoAtual As String
                    'le cada campo delimitado no arquivo e atribui ao TextBox
                    For Each campoAtual In linhaAtual
                        txtDados.Text += campoAtual
                    Next
                    'define uma  nova linha no TextBox que exibe os dados
                    txtDados.Text += vbCrLf
                Catch ex As MalformedLineException
                    MsgBox("A linha  " & ex.Message & " não é valida e será descartada.")
                End Try
            End While
        End Using
     End If
    End Sub

Entendendo os principais pontos do código:

1 - Using leitorArquivoCSV As New TextFieldParser(txtArquivoCSV.Text)

Criamos uma instância da classe TextFieldParser passando o nome e caminho do arquivo texto.
Essa classe possui 8 construtores. Para detalhes veja em :
http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.aspx

2 -  leitorArquivoCSV.TextFieldType = FileIO.FieldType.Delimited

A propriedade TextFieldType define o tipo de arquivo :

3-  leitorArquivoCSV.SetDelimiters(",")

A propriedade SetDelimiters define o delimitador usado no arquivo texto.
O conteúdo existente da propriedade delimitadores são apagados quando esse método é definido.
Este método fornece uma maneira para definir delimitadores sem criar uma matriz.

4-  leitorArquivoCSV.CommentTokens = New String() {"#"}

A propriedade CommnetTokens define trechos de comentário. (Um array de strings contendo todos os trechos de comentários)
Um token de comentário é uma seqüência que, quando colocada no início de uma linha, indica que a linha é um comentário e deve ser ignorada pelo analisador.

5-  leitorArquivoCSV.HasFieldsEnclosedInQuotes = True

A propriedade HasFieldsEnclosedInQuotes indica se existem  campos que estão colocados entre aspas quando um arquivo delimitado está sendo analisado.
Se a propriedade for True, o analisador assume que os campos são colocados entre aspas ("") e pode conter finais de linha.

6-  leitorArquivoCSV.ReadLine()

O método ReadLine retorna a linha atual como uma string e avança para a próxima linha

7-  While Not leitorArquivoCSV.EndOfData

A propriedade EndOfData retorna True se não existem linhas em branco e sem comentários entre a posição atual do cursor e o fim do arquivo.

8-  linhaAtual = leitorArquivoCSV.ReadFields()

O método ReadFields() lê todos os campos na linha atual, retornando-os como um array de strings, e avança o cursor para a próxima linha que contenha dados.

9-    Catch ex As MalformedLineException

A exceção MalformedLineException é lançada quando um TextFieldParser não pode analisar uma linha usando o formato especificado.
A propriedade  ErrorLine do objeto de exceção contém o texto da linha que causou o erro.

Executando o projeto veremos o resultado do parse do arquivo Clientes.csv abaixo:

Na próxima vez que precisar tratar arquivos textos delimitados você já sabe use os recursos da classe TextFieldParser.

Pegue o projeto completo aqui :   Usando_TextFieldParser.zip 

João 1:1 No princípio era o Verbo, e o Verbo estava com Deus, e o Verbo era Deus.

João 1:2 Ele estava no princípio com Deus.

João 1:3 Todas as coisas foram feitas por intermédio dele, e sem ele nada do que foi feito se fez.

João 1:4 Nele estava a vida, e a vida era a luz dos homens;

João 1:5 a luz resplandece nas trevas, e as trevas não prevaleceram contra ela.

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti