VB .NET - Convertendo CSV para DataTable


Neste artigo vamos converter arquivos no formato CSV para DataTable usando a linguagem VB .NET.

Um arquivo CSV é um arquivo texto delimitado que utiliza a vírgula para separar os valores existentes no arquivo, sendo que existem implementações onde outros separadores também podem ser usados.

Os arquivos CSV mais simples não permitem valores que contém vírgula (Ex: Rua Teste, 100) ou outros caracteres especiais como o indicador de nova linha CR ou LF. (Carriage Return/ Line Feed) . Implementações mais sofisticadas permitem vírgulas, ponto e vírgula(;), asterístico(*) como delimitadores e outros caracteres especiais.

Vamos criar uma classe chamada Conversor contendo os seguintes métodos:

Recursos Usados

Objetivo

Criando o projeto

Abra o VS Express 2012 for Windows Desktop e no menu FILE clique em New Project;

Selecione o template Visual Basic -> Windows -> Windows Forms Application informando o nome CSV_DataTable;

No formulário padrão form1.vb inclua os seguintes controles:

Disponha os controles conforme o leiaute da figura abaixo:

No menu PROJECT clique em Add Class e informe o nome Conversor.vb e a seguir digite o código abaixo nesta classe:

Imports System.IO
Imports System.Text
Public Class Conversor
    Private NomeArquivo As String
  
    Public Sub New(ByVal NomeArquivo As String)
        Me.NomeArquivo = NomeArquivo
    End Sub
  
   Public Function getColunas(ByVal nomeColunas As Boolean) As String()
        Try
            Dim leitorArquivo As New StreamReader(NomeArquivo)
            Dim linha As String = leitorArquivo.ReadLine
            leitorArquivo.Close()
            Dim Colunas() As String = linha.Split(",")
            If nomeColunas Then
                Return Colunas
            End If
            Dim i As Integer = 1
            Dim c As Integer = 0
            Dim nome_Colunas(Colunas.Count - 1) As String
            For Each column As String In Colunas
                nome_Colunas(c) = "coluna" & i
                i += 1
                c += 1
            Next
            Return nome_Colunas
        Catch ex As Exception
            Throw ex
        End Try
        Return Nothing
    End Function

    Public Function ConverteCSVParaDataTable(ByVal nomeColunas As Boolean) As DataTable
        Try
            Dim dt As New DataTable
            For Each nome_Coluna In getColunas(nomeColunas)
                dt.Columns.Add(nome_Coluna)
            Next
            Dim leitorArquivo As New StreamReader(NomeArquivo)
            If nomeColunas Then
                leitorArquivo.ReadLine()
            End If
            Dim linha As String = leitorArquivo.ReadLine
            While Not IsNothing(linha)
                linha = linha.Replace(Chr(34), "")
                dt.Rows.Add(linha.Split(","))
                linha = leitorArquivo.ReadLine
            End While
            leitorArquivo.Close()
            Return dt
        Catch ex As Exception
            Throw ex
        End Try
        Return Nothing
    End Function

    Public Function ConverteTabelaParaCSV(ByVal _tabela As DataTable, ByVal _nomeArquivo As String, 
ByVal sepChar As String) As Boolean
  
       Dim writer As StreamWriter = Nothing
        Try
            writer = New StreamWriter(_nomeArquivo)
            ' primeiro escreva a linha com o nome das colunas
            Dim separador As String = ""
            Dim builder As New StringBuilder
            For Each col As DataColumn In _tabela.Columns
                builder.Append(separador).Append(col.ColumnName)
                separador = sepChar
            Next
            writer.WriteLine(builder.ToString())
            ' escrever todas as linhas
            For Each row As DataRow In _tabela.Rows
                separador = ""
                builder = New StringBuilder
                For Each col As DataColumn In _tabela.Columns
                    builder.Append(separador).Append(row(col.ColumnName))
                    separador = sepChar
                Next
                writer.WriteLine(builder.ToString())
            Next
            Return True
        Catch
            Return False
        Finally
            If Not writer Is Nothing Then writer.Close()
        End Try
    End Function    
End Class

Esta classe é responsável por obter o nome das colunas e gerar um datatable a partir do arquivo CSV.

No evento Click do botão de comando btnArquivo temos o código a seguir que obtém o caminho e nome do arquivo CSV:

 Private Sub btnArquivo_Click(sender As Object, e As EventArgs) Handles btnArquivo.Click

        Dim AbrirComo As OpenFileDialog = New OpenFileDialog()
        Dim caminho As DialogResult
        AbrirComo.Title = "Abrir como"
        AbrirComo.InitialDirectory = "C:\Dados"
        AbrirComo.FileName = "Nome Arquivo"
        AbrirComo.Filter = "Arquivos Textos (*.*)|*.*"
        caminho = AbrirComo.ShowDialog
        nomeArquivo = AbrirComo.FileName
        If nomeArquivo = Nothing Then
            MessageBox.Show("Arquivo Inválido", "Arquivo", MessageBoxButtons.OK)
        Else
            txtArquivo.Text = AbrirComo.FileName
        End If
    End Sub

No evento Click do botão de comando - Ler Arquivo CSV - temos o código a seguir que lê o arquivo CSV e o exibe no controle ListBox (lstDados):

Private Sub LerArquivoCSV()
        Dim caminhoArquivo As String = txtArquivo.Text.Trim
        If IO.File.Exists(txtArquivo.Text) Then
            Dim consulta As String() = File.ReadAllLines(caminhoArquivo)
            For Each item In consulta
                lstDados.Items.Add(item)
            Next
            btnConverterCSV.Enabled = True
        Else
            MessageBox.Show("O arquivo <<" & txtArquivo.Text & ">> não foi localizado !")
        End If
    End Sub

No botão - Converter para DataTable - temos o seguinte código no evento Click que cria uma instância da classe Conversor e chama o método ConverterCSVPara DataTable() retornando um objeto datatable que é exibido no controle DataGridView:

Private Sub btnConverterCSV_Click(sender As Object, e As EventArgs) Handles btnConverterCSV.Click
        Try
            Dim conv As New Conversor(nomeArquivo)
            dgvDados.DataSource = conv.ConverteCSVParaDataTable(True)
            btnTableCSV.Visible = True
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

A seguir temos o código que faz o processo inverso, i.e, converte um DataTable para um arquivo CSV na pasta c:\dados:

  Private Sub btnTableCSV_Click(sender As Object, e As EventArgs) Handles btnTableCSV.Click
        Try
            Dim conv As New Conversor(nomeArquivo)
            conv.ConverteTabelaParaCSV(conv.ConverteCSVParaDataTable(True), "c:\dados\Macoratti_" & Now.Minute & ".txt", ",")
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

A seguir vemos o projeto em execução onde a partir do arquivo CSV geramos um datatable:

Pegue o projeto completo aqui: CSV_DataTable.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;

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

Quer migrar para o VB .NET ?

Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira...

Quer aprender C# ??

Chegou o Super DVD C#  com exclusivo material de suporte e vídeo aulas com curso básico sobre C#.

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti