C# -  Gerando e Lendo arquivos CSV (revisão)

Este artigo mostra como podemos gerar um arquivo CSV a partir de um banco de dados SQL Server. Mostra também como podemos acessar o arquivo CSV e exibir o seu conteúdo em um controle DataGridView.

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

Iremos usar a função Split() que é muito versátil e pode ser usada em muitos cenários quando precisamos separar strings.

A função Split() retorna um array de única dimensão contendo o número de substrings separadas no processo dependendo do critério e delimitador usado.

As operações de input e output na  plataforma .NET são gerenciadas pela classe abstrata Stream que esta no namespace System.IO, mas não podemos usar a classe Stream diretamente para acessar arquivos, para fazer isso usamos as classe StreamReader para ler e StreamWriter para escrever em arquivos textos.

Objetivo

Vamos acessar um banco de dados SQL Server chamado Agenda.mdf e gerar um arquivo CSV a partir da tabela Clientes que tem a seguinte estrutura;

Para fazer a conexão com o banco de dados vamos obter a string de conexão do arquivo App.config usando a classe ConfigurationManger. Para fazer isso devemos incluir uma referência no projeto ao namespace System.Configuration. Abaixo vemos a string e conexão no arquivo App.Config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        <add name="ConexaoSQLClientes"
            connectionString="Data Source=(LocalDB)\v11.0;Initial Catalog=Agenda;Integrated Security=True" providerName="System.Data.SqlClient" />
    </connectionStrings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>

O arquivo CSV será gerado na pasta c:\dados\ com o nome Clientes.csv de onde iremos ler o seu conteúdo exibindo os dados no controle DataGridView.

Recursos usados:

Criando o projeto

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

Selecione a linguagem Visual C# e o template Windows Forms Application e informe o nome SQL_CSV;

Para isso vamos incluir no formulário form1.cs os seguintes controles:

  1. TabControl - tabControl1 - TabPage1 = Gerar Arquivo CSV
  1. TabControl - tabControl1 - TabPage1 = Exibir CSV

Disponha os controles conforme o leiaute da figura abaixo:


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


using
System;

using System.Data;

using System.Windows.Forms;

using System.Configuration;

using System.Data.SqlClient;

using System.IO;

Após a declaração da classe Form1 vamos definir uma variável que será visível no formulário todo  para armazenar o caminho e nome do arquivo CSV:

string arquivoCSV = "";

Na TabPage1 , no evento Click do botão de comando - Obter String de Conexão - inclua o código abaixo:

private void btnStringConexao_Click(object sender, EventArgs e)

{

try

{

    txtStringConexao.Text =  ConfigurationManager.ConnectionStrings["ConexaoSQLClientes"].ConnectionString;

}

catch (Exception ex)

{

     MessageBox.Show("Erro " + ex.Message);

}

}

Agora no evento Click do botão de comando Gerar Arquivo CSV - defina o seguinte código:

private void btnGerarCSV_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(txtArquivoCSV.Text))
            {
                MessageBox.Show("Informe o caminho e nome do arquivo CSV !", "Arquivo CSV", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                arquivoCSV = txtArquivoCSV.Text;
            }
            try
            {
                SqlConnection cn = new SqlConnection(txtStringConexao.Text);
                SqlDataAdapter adp = new SqlDataAdapter("select * from Clientes", cn);
                DataTable dt = new DataTable();
                adp.Fill(dt);
                //cria um streamwriter para escrever no arquivo CSV
                StreamWriter sw = new StreamWriter(txtArquivoCSV.Text, false);
                int iColCount = dt.Columns.Count;
                //conta as colunas para montar o cabecalho
                for (int i = 0; i < iColCount; i++)
                {
                    sw.Write(dt.Columns[i]);
                    if (i < iColCount - 1)
                    {
                        sw.Write(",");
                    }
                }
                sw.Write(sw.NewLine);
                //percorre cada linha do datatable e monta o arquivo CSV
                foreach (DataRow dr in dt.Rows)
                {
                    for (int i = 0; i < iColCount; i++)
                    {
                        if (!Convert.IsDBNull(dr[i]))
                        {
                            sw.Write(dr[i].ToString());
                        }
                        if (i < iColCount - 1)
                        {
                            sw.Write(",");
                        }
                    }
                    sw.Write(sw.NewLine);
                }
                sw.Close();
                MessageBox.Show("Arquivo CSV gerado com sucesso !", "Arquivo CSV", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

Agora, na TabPage2, no evento Click do botão de comando Obter dados do arquivo CSV inclua o código abaixo:

 private void btnObterCSV_Click(object sender, EventArgs e)
 {
            try
            {
                arquivoCSV = txtArquivoCSV.Text;
                string strLinha;
                string[] strArray;
                char[] charArray = new char[] { ',' };
                DataSet ds = new DataSet();
                DataTable dt = ds.Tables.Add("Clientes");
                string path = arquivoCSV;
                //cria um stream no modo Open
                FileStream aFile = new FileStream(path, FileMode.Open);
                // le o arquivo CSV
                StreamReader sr = new StreamReader(aFile);
                // le um al inha do arquivo
                strLinha = sr.ReadLine();
                // cria um array separando os campos 
                strArray = strLinha.Split(charArray);
                 //percorre cada linha do array e extrai as colunas
                for (int x = 0; x <= strArray.GetUpperBound(0); x++)
                {
                    dt.Columns.Add(strArray[x].Trim());
                }
                strLinha = sr.ReadLine();
                while (strLinha != null)
                {
                    strArray = strLinha.Split(charArray);
                    DataRow dr = dt.NewRow();
                    for (int i = 0; i <= strArray.GetUpperBound(0); i++)
                    {
                        dr[i] = strArray[i].Trim();
                    }
                    dt.Rows.Add(dr);
                    strLinha = sr.ReadLine();
                }
                sr.Close();
                dgvDados.DataSource = dt;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message,"Erro", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
   }

Executando o projeto após gerar o arquivo Clientes.csv iremos obter o seguinte resultado:

Abrindo o arquivo Clientes.csv na pasta c:\dados usando o editor de textos NotePad++  podemos visualizar o seu conteúdo:

Após, isso acionando a TabPage2, e clicando no botão Obter dados do arquivo CSV teremos o seguinte resultado:

Com este artigo eu quis mostrar como gerar e acessar um arquivo CSV usando a linguagem C#. Se o arquivo delimitado por vírgula contiver dados com apóstrofe e/ou vírgulas você terá um problema e terá que realizar o parse da string para verificar se a vírgula faz parte do campo ou não.

Como exercício proponho que você crie o código para atualizar o arquivo CSV a partir do DataGridView e a seguir atualizar a tabela do banco de dados SQL Server com os dados do arquivo CSV. (Eu ja deixei um código comentado que precisa ser ajustado)

Pegue o projeto completo aqui :   SQL_CSV.zip

Filipenses 2:3 nada façais por contenda ou por vanglória, mas com humildade cada um considere os outros superiores a si mesmo;

Filipenses 2:4 não olhe cada um somente para o que é seu, mas cada qual também para o que é dos outros.

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