VB
.NET - Importando e tratando arquivos CSV
![]() |
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.
Este é mais um artigo onde vou mostrar como importar e tratar arquivos CSV.
Neste artigo eu vou importar e tratar arquivos CSV que usa a virgula para separar os valores do arquivo.
Vou usar o provedor OleDb para acessar os arquivos texto no padrão CSV usando a string de conexão adequada.
A string de conexão usada para acessar arquivos textos é dada abaixo:
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\caminho\;Extended Properties=""text;HDR=Yes;FMT=Delimited"""
onde "HDR=Yes;" - indica que a primeira linha contém os nomes das colunas e não dados.
Vou importar e exibir o conteúdo dos arquivos em um controle DataGridView e permitir que o usuário realize o tratamento do arquivo realizando algumas consultas que serão destacadas no DataGridView e também permitindo que o arquivo seja exportado para o Excel.
Em nosso exemplo vou usar dois arquivos textos como exemplo:
1- O arquivo Contatos.csv que representa uma relação de contatos com nome, idade e sexo e cujo conteúdo é visto abaixo:
| Primeiro,Ultimo,Idade,Sexo Jose Carlos,Macoratti,21,Masculino Janice,Rachel,32,Masculino Jefferson,Ribeiro,24,Feminino Miriam,Bueno,18,Masculino Lucia,Ramos,44,Feminino Tomas,Dos Santos,33,Masculino Justina,Granola,25,Masculino Pedrita,Dola,18,Feminino |
2- O arquivo SextaFeira_Treze.csv que relaciona os meses e anos cuja sexta-feira cai no dia 13, mostrado a seguir:
|
Mes,ano1,ano2,ano3,ano4,ano5,ano6,ano7,ano8,ano9 Janeiro,1978,1984,1989,1995,2006,2012,2017,2023,2034 Fevereiro,1976,1981,1987,1998,2004,2009,2015,2026,2032 Março,1981,1987,1992,1998,2009,2015,2020,2026,2037 Abril,1973,1979,1984,1990,2001,2007,2012,2018,2029 Maio,1977,1983,1988,1994,2005,2011,2016,2022,2033 Junho,1975,1980,1986,1997,2003,2008,2014,2025,2031 Julho,1973,1979,1984,1990,2001,2007,2012,2018,2029 Agsoto,1971,1976,1982,1993,1999,2004,2010,2021,2027 Setembro,1974,1985,1991,1996,2002,2013,2019,2024,2030 Outubro,1972,1978,1989,1995,2000,2006,2017,2023,2028 Novembro,1981,1987,1992,1998,2009,2015,2020,2026,2037 Dezembre,1974,1985,1991,1996,2002,2013,2019,2024,2030 |
Note que em ambos os arquivos a primeira linha representa o cabeçalho com os nomes das colunas dos dados.
Para importar os arquivos vou criar uma aplicação usando o Visual Studio 2012 Express for Destkop com o nome Importar_Tratar_CSV;
Após criar a solução no Visual Studio usando o template Windows Forms Application inclua a partir da ToolBox os seguintes controles no formulário form1.vb:
Disponha os controles conforme o leiaute da figura abaixo:
![]() |
Os namespaces usados neste formulário são:
Imports
System.IOImports
System.Data.OleDbImports
Microsoft.Office.Interop
Quando a aplicação for carregada o evento Load do formulário verifica se o arquivo log.txt existe e grava informações sobre nome do usuário e data de início do programa.
Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
Me.Text = "Importar e Tratar CSV | v" & My.Application.Info.Version.ToString
Dim arquivoExiste As Boolean
arquivoExiste = My.Computer.FileSystem.FileExists(My.Application.Info.DirectoryPath & "/log.txt")
If arquivoExiste = False Then
If MessageBox.Show("O arquivo de log não existe, você gostaria de criar um agora ?", "Arquivo de Log", MessageBoxButtons.YesNo,
MessageBoxIcon.Question) = DialogResult.Yes Then
My.Computer.FileSystem.WriteAllText(My.Application.Info.DirectoryPath & "/log.txt", String.Empty, False)
MsgBox("Arquivo de log criado!")
End If
End If
Dim xLog As String = My.Application.Info.DirectoryPath & "/log.txt"
Dim vt As String = vbCrLf & My.Application.Info.Version.ToString & " - " & My.User.Name & " - Programa Iniciado." & Date.Now
Try
My.Computer.FileSystem.WriteAllText(xLog, vt, True)
Catch ex As Exception
MessageBox.Show(ex.ToString, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
|
Para ver o conteúdo do arquivo Log.txt clique na figura sob o texto Log no formulário. O código usado para exibir o arquivo Log.txt é mostrado abaixo:
Private Sub picLog_Click(sender As System.Object, e As System.EventArgs) Handles picLog.Click
Dim xLog As String = My.Application.Info.DirectoryPath & "/log.txt"
Diagnostics.Process.Start(xLog)
End Sub
|
Após iniciar a aplicação o usuário deverá clicar no botão Importar CSV onde será aberto uma caixa de diálogo para selecionar o arquivo desejado.
Após selecionar o arquivo o código abaixo no evento Click do botão irá importar o arquivo exibindo no controle DataGridView:
Private Sub btnImportarCSV_Click(sender As System.Object, e As System.EventArgs) Handles btnImportarCSV.Click
Try
ofd1.InitialDirectory = My.Application.Info.DirectoryPath
If ofd1.ShowDialog(Me) = DialogResult.OK Then
Dim nomeArquivo As New FileInfo(ofd1.FileName)
Dim stringConexao As String = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Text;Data Source=" & nomeArquivo.DirectoryName
Dim objConn As New OleDbConnection(stringConexao)
objConn.Open()
Dim oCmdSelect As New OleDbCommand("SELECT * FROM " & nomeArquivo.Name, objConn)
Dim oAdapter As New OleDbDataAdapter
oAdapter.SelectCommand = oCmdSelect
Dim objdataset1 As New DataSet
oAdapter.Fill(objdataset1, "teste")
dgView.DataSource = objdataset1.Tables(0).DefaultView
objConn.Close()
End If
Catch ex As Exception
MessageBox.Show(ex.ToString, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub |
O código usa o provedor OleDb com a string de conexão apropriada para acessar o arquivo escolhido.
A seguir usando os objetos OledbCommand, OledbDataAdapter e DataSet, selecionamos todos os dados do arquivos e preenchemos um dataset exibindo-o a seguir no controle DataGridView usando a propriedade DataSource.
Conforme o arquivo selecionado podemos realizar algumas consultas destacando-as no controle DataGridView Vou mostrar apenas uma delas pois o processo usado para as demais é parecido.
Marcando o primeiro checkbox onde vamos destacar as idades maior ou igual a informada na caixa de texto. No exemplo informei o valor 30.
Clicando no botão Destacar no Arquivo CSV temos o seguinte resultado:
![]() |
O código responsável por esta e pelas demais consultas no primeiro GroupBox para o arquivo Contatos.csv é dado a seguir:
Private Sub btnDestacar1_Click(sender As System.Object, e As System.EventArgs) Handles btnDestacar1.Click
Try
dgView.CurrentCell.Selected = False
limpaGrid()
Me.dgView.ClearSelection()
If chkIdadeMaiorQue.CheckState = CheckState.Checked Then
Dim cell As DataGridViewCell
Dim cellVar As Integer
For Each row As DataGridViewRow In Me.dgView.Rows
cell = row.Cells(2)
cellVar = CInt(row.Cells(2).Value)
If cellVar > txtIdade.Text Then
row.Selected = True
End If
Next
End If
If chkFeminino.CheckState = CheckState.Checked Then
Dim cell As DataGridViewCell
Dim cellVar As String
For Each row As DataGridViewRow In Me.dgView.Rows
cell = row.Cells(3)
cellVar = CStr(row.Cells(3).Value)
If cellVar = "Feminino" Then
row.Selected = True
End If
Next
End If
If chkSobrenome.CheckState = CheckState.Checked Then
If Not String.IsNullOrEmpty(txtSobrenome.Text) Then
Dim cell As DataGridViewCell
Dim cellVar As String
For Each row As DataGridViewRow In Me.dgView.Rows
cell = row.Cells(1)
cellVar = CStr(row.Cells(1).Value)
If cellVar = txtSobrenome.Text Then
row.Selected = True
cell.Style.BackColor = Color.Red
End If
Next
Else
MessageBox.Show("Informe o sobrenome...")
' desmarcaCheckBox()
Exit Sub
End If
End If
If chkTodosFemininos.CheckState = CheckState.Checked Then
Dim cell As DataGridViewCell
Dim cellVar As String
For Each row As DataGridViewRow In Me.dgView.Rows
cell = row.Cells(3)
cellVar = CStr(row.Cells(3).Value)
If cellVar = "Feminino" Then
cell.Selected = True
End If
Next
End If
If chkTodosMasculinos.CheckState = CheckState.Checked Then
Dim cell As DataGridViewCell
Dim cellVar As String
For Each row As DataGridViewRow In Me.dgView.Rows
cell = row.Cells(3)
cellVar = CStr(row.Cells(3).Value)
If cellVar = "Masculino" Then
cell.Selected = True
End If
Next
End If
Catch ex As Exception
MessageBox.Show("Importe o arquivo CSV para continuar....", "Aviso", MessageBoxButtons.OK,
MessageBoxIcon.Information)
End Try
desmarcaCheckBox()
End Sub
|
Além disso estou usando as seguintes rotinas:
Private Sub limpaGrid()
For Each row As DataGridViewRow In Me.dgView.Rows
row.Selected = False
Next
End Sub
Private Sub desmarcaCheckBox()
For Each c As CheckBox In GroupBox1.Controls
If c.CheckState = CheckState.Checked Then
c.CheckState = CheckState.Unchecked
End If
Next
For Each c As CheckBox In GroupBox2.Controls
If c.CheckState = CheckState.Checked Then
c.CheckState = CheckState.Unchecked
End If
Next
End Sub
|
O código do evento Click do botão Exportar CSV que exporta o arquivo para o Excel é visto abaixo:
Private Sub btnExportarCSV_Click(sender As System.Object, e As System.EventArgs) Handles btnExportarCSV.Click If dgView.RowCount - 1 > 0 Then
Dim rowsTotal, colsTotal As Short
Dim I, j, iC As Short
System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
Dim xlApp As New Excel.Application
Try
Dim excelBook As Excel.Workbook = xlApp.Workbooks.Add
Dim excelWorksheet As Excel.Worksheet = CType(excelBook.Worksheets(1), Excel.Worksheet)
xlApp.Visible = True
rowsTotal = dgView.RowCount - 1
colsTotal = dgView.Columns.Count - 1
With excelWorksheet
.Cells.Select()
.Cells.Delete()
For iC = 0 To colsTotal
.Cells(1, iC + 1).Value = dgView.Columns(iC).HeaderText
Next
For I = 0 To rowsTotal
For j = 0 To colsTotal
.Cells(I + 2, j + 1).value = dgView.Rows(I).Cells(j).Value
Next j
Next I
.Rows("1:1").Font.FontStyle = "Bold"
.Rows("1:1").Font.Size = 10
.Cells.Columns.AutoFit()
.Cells.Select()
.Cells.EntireColumn.AutoFit()
.Cells(1, 1).Select()
End With
Catch ex As Exception
Dim meuArquivo As String = My.Settings.LogFile
Dim itxt As New TextBox
If IO.File.Exists(meuArquivo) Then
itxt.Text = IO.File.ReadAllText(meuArquivo)
End If
Dim vt As String = vbCrLf & Date.Now & " - " & My.Application.Info.Version.ToString & "--" & "Exportação para Excel ERRO - "
& My.User.Name & itxt.Text
My.Computer.FileSystem.WriteAllText(meuArquivo, vt, False)
itxt.Clear()
Finally
'libera os recursos alocados
System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
xlApp = Nothing
End Try
Else
MessageBox.Show("Importe o arquivo CSV para continuar....", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End Sub
|
Creio que estes são os destaques desde singelo programa feito na linguagem VB .NET.
Pegue o sistema completo aqui:
Importar_Tratar_CSV.zip
Mateus 15:19
Porque do coração procedem os maus pensamentos, homicídios, adultérios, prostituição, furtos, falsos testemunhos e blasfêmias.Mateus 15:20
São estas as coisas que contaminam o homem; mas o comer sem lavar as mãos, isso não o contamina.Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#