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 |
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:
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
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 :
FixedWidth - indica que o arquivo possui tamanho fixo
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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#