C# - Lendo arquivos delimitados para um DataTable


Hoje vamos recordar como ler arquivos delimitados para um DataTable na linguagem C#.

Já publiquei diversos artigos tratando deste assunto mas ele nunca se esgota. Hoje vou mostrar uma maneira de ler arquivos delimitados para um DataTable usando a linguagem C#.

Para acompanhar melhor o artigo é recomendável que você leia as referências sobre o tratamento e leitura de arquivos textos e delimitados visto que não vou entrar em detalhes sobre esse assunto.

Mesmo que você não vá utilizar um banco de dados a opção de ler um arquivo texto delimitado para um DataTable ainda te traz vantagens pois evita que você tenha que criar código para o tratamento de strings e facilita o acesso os dados importados pela sua aplicação.

Como exemplo você pode simplesmente vincular o DataTable a um controle de grade como DataGridView ou GridView para exibir os resultados, ou você pode usar os recursos do LINQ para DataTables sobre o resultado para realizar a manipulação dos dados.

Como exemplo eu vou usar um arquivo texto chamado Clientes.txt que esta na pasta c:\dados com o seguinte conteúdo:

Codigo, Nome, Cidade, DataMatricula
1,Macoratti,Santos,20120411
2,Jefferson,Americana,20120417
3,Miriam,Campinas,20120410
4,Janice,Catanduva,20120405

O arquivo Clientes.txt é um arquivo CSV - Comma separated value onde na primeira linha temos os nomes das colunas.

Nosso objetivo será acessar o arquivo , ler o seu conteúdo e incluir o conteúdo em um DataTable.

Criando o projeto no VS 2017

Abra o Visual Basic 2017 Community e no menu File clique em New Project selecionando o template Windows Classic Desktop e Windows Forms App e informando o nome CShp_txt_db;

No formulário form1.cs vamos incluir os seguintes componentes:

  1. 2 Panels - Panel1 - Dock: Top e Panel2 - Dock: Bottom
  2. ListBox = lstDados
  3. DataGridView - gdvDadaos
  4. Button - btnLerTxt
  5. Button - btnSair

Nota: Inclua o ListBox no Panel1 e o DataGridView no Panel2

Conforme o leiaute abaixo:

Vamos declarar os seguintes namespaces no formulário para que possamos os recursos necessários ao nosso projeto:

using System;
using System.Data;
using System.Data.OleDb;
using System.IO;
using System.Windows.Forms;

No evento Click do botão - Ler arquivo TXT para DataTable - vamos definir a chamada para a rotina LerTxtParaDataTable() :

       private void btnLerTxt_Click(object sender, EventArgs e)
        {
            LerTxtParaDataTable();
        }

A rotina LerTxtParaDataTable() tem o seguinte código:

        private void LerTxtParaDataTable()
        {
            string nomeArquivo = @"c:\dados\txt\clientes.txt";
            string nomeDiretorio = Path.GetDirectoryName(Application.ExecutablePath);
            DataTable dt;
            using (OleDbConnection cn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;" + 
                                                             "Data Source=" + nomeDiretorio + ";" + 
                                                             "Extended Properties=\"Text;HDR=Yes;FMT=Delimited\""))
            {
                cn.Open();
                using (OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM " + nomeArquivo, cn))
                {
                    dt = new DataTable("Clientes");
                    adapter.Fill(dt);
                }
            }
            ExibirTexto();
            dgvDados.DataSource = dt;
        }

Este código começa por declarar variáveis para armazenar o arquivo de texto, o nome do diretório e o arquivo contendo o DataTable.

Esta técnica só funciona com um conjunto padrão de extensões de nome de arquivo. O arquivo pode estar em qualquer diretório.

Neste exemplo, o arquivo esta na pasta c:\dados\txt.

A instrução a seguir configura a conexão com o diretório ele define a propriedade Provider para usar o provedor Microsoft.Jet.OLEDB.

A propriedade da fonte de dados - Data Source - define o diretório que contém o arquivo de texto.

As propriedades estendidas que definem que o arquivo será do tipo texto ("Text"), e que tem um cabeçalho (HDR = Yes), e que esta em um formato de arquivo delimitado (FRM delimitado =).

As propriedades estendidas devem estar dentro de aspas, assim entre aspas (VB) ou barras (C#).

Em seguida, o código abre a conexão, e assim o arquivo. Uma vez que este código está em uma instrução using, o arquivo é fechado automaticamente no final do bloco usando.

A segunda instrução usa um DataAdapter, definindo uma instrução Select e a conexão aberta.

A instrução Select seleciona todas as informações de um arquivo específico, tal como definido pela variável nomeArquivo.

Em seguida, o código cria o DataTable, com o nome Clientes.

Finalmente, usamos o método Fill do TableAdapter para ler os dados do arquivo de texto para o DataTable.

Para exibir o arquivo texto no controle ListBox usamos a rotina ExibirTexto() conforme código abaixo:

       private void ExibirTexto()
        {
            string caminhoArquivo = @"C:\dados\txt\Clientes.txt";
            string[] consulta = File.ReadAllLines(caminhoArquivo);
            foreach (var item in consulta)
                      lstDados.Items.Add(item);
        }

Executando o projeto iremos obter :

Pegue o projeto completo aqui: CShp_txt_db.zip

"Porque o reino de Deus não consiste em palavras, mas em poder."
1 Coríntios 4:20

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

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

"Porque o reino de Deus não consiste em palavras, mas em poder."
1 Coríntios 4:20

Referências:


José Carlos Macoratti