Back-End

18 fev, 2010

C# – Lendo arquivos textos delimitados com LINQ

Publicidade

Este artigo mostra como ler um
arquivo texto delimitado usando LINQ.

Como exemplo eu vou usar um arquivo
texto delimitado por vírgula com a seguinte informação:

  • nome,
    email, cidade e pais

O arquivo vai ter o nome de Clientes.txt
e terá o seguinte conteúdo:

Jose
C Macoratti,macoratti@yahoo.com,Brasilia,Brasil
Jefferson A Ribeiro,jeff@net.com.br,London,Great Britain
Janice Lima,janicer@rad.com,Nevada,USA
Miriam Maquila,miriam@net.com,Madri,Spain
Jessica Lang,jessicalang@trop.net,Toronto,Canada
Yuri Jemming,yuri@trop.net,California,USA

Antes de começar a leitura do
arquivo texto, vamos criar uma classe que irá tratar os registros
que vamos ler a partir do arquivo texto.

Para isso vamos criar uma classe Cliente
conforme abaixo:

public class Cliente
{
public string Nome { get; set; }

public string Email { get; set; }
public string cidade { get;
set; }
public string Pais { get; set; }
}

Com isso estamos pronto para ler os
dados a partir do nosso arquivo usando LINQ.

Vamos ler o arquivo inteiro e exibir
o resultado usando o seguinte código:

void BtnLerClick(object sender, EventArgs e)
{

string caminhoArquivo = "C:\\dados\\Clientes.txt";

var consulta =
from linha in
File.ReadAllLines(caminhoArquivo)
let clienteDados =
linha.Split(',')
select new Cliente()
{

Nome = clienteDados[0],
Email =
clienteDados[1],
Cidade = clienteDados[2],

Pais = clienteDados[3],
};


foreach (var item in consulta)
{

lstTexto.Items.Add(item.Nome +","+ item.Email + ","+ item.Cidade + ","+
item.Pais);
}
}

O comando File.ReadAllLines()
retorna um array de linhas, usamos então a função Split
para separar os registros pela vírgula.

  • Overloads
    Public Function Split(ParamArray Char() AS String) – Este
    método identifica as
    substrings presentes em uma string que são delimitadas
    por um ou mais caracteres específicos em uma matriz ,
    extrai as substrings e as coloca em uma matriz de
    strings.
  • Overloads Public Function Split(Char(),
    Integer) As String() – Este método identifica as
    substrings
    presentes em uma string que são delimitadas por um ou
    mais caracteres específicos em uma matriz , extrai as
    substrings e as coloca em uma matriz de strings. O
    inteiro é o parâmetro que especifica o número máximo
    de elementos da matriz a retornar.
  • O
    Método
    File.ReadAllLines (String) – abre um arquivo de texto, lê
    todas
    as linhas do arquivo e, em seguida, fecha o arquivo. Retorna uma matriz de strings que contém todas as linhas
    do arquivo lido.
        public static
string[] ReadAllLines ( string path )

Obs: Para arquivos muito
grandes
este método tem uma execução lenta.

  • O
    Método
    StreamReader.ReadLine
    – lê uma linha de caracteres do fluxo atual e retorna os
    dados como uma cadeia de Caracteres. Retorna a próxima linha do fluxo de dados ou uma
    referência Null (Nothing no VB) se o final do arquivo for alcançado.

Podemos também filtrar a leitura
lendo somente os clientes de um determinado país:

var consulta =
from c in
(from linha
in File.ReadAllLines(caminhoArquivo)
let clientesDados =
linha.Split(',')
select new Cliente()

{
Nome = clientesDados [0],

Email = clientesDados [1],
Cidade =
clientesDados [2],
Pais = clientesDados [3],

})
where c.Pais == "USA"
select
c;

A vantagem em usar o LINQ é a
flexibilidade e o poder em realizar as consultas. Podemos, por
exemplo, selecionar clientes que tenham a palavra net contida no
email:

var consulta =
from c in
(from linha
in File.ReadAllLines(caminhoArquivo)
let clientesDados =
linha.Split(',')
select new Cliente()

{
Nome = clientesDados [0],

Email = clientesDados [1],
Cidade =
clientesDados [2],
Pais = clientesDados [3],

})
where c.Email.Contains("net")

select c;

Vamos criar uma aplicação Windows
Forms no SharpDevelop 3.0 para mostrar o exemplo
funcionando:

Nota: Podemos usar
também o Visual
C# 2008 Express Edition.

No menu Arquivo selecione Novo
-> Solução
e a seguir selecione as opções C#
-> Aplicações Windows
e em Modelos Aplicação
Windows
informando o nome LerArquivoTexto. Para
criar
o projeto, clique no botão Criar;

Declare a utilização dos
namespaces abaixo:

  • using System.Linq;
  • using System.IO;

Declare no início do formulário a
variável para conter o nome e caminho do arquivo texto:

  • string caminhoArquivo =
    “C:\\dados\\Clientes.txt”;

A seguir defina o seguinte leiaute
no formulário padrão form1.cs:

No menu Projeto ->
Adicionar Novo Item
selecione o item Classe,
informe o nome Cliente.cs para criar a classe Cliente.

Agora basta colocar no evento Click
de cada um dos botões o código correspondente. A seguir vemos o
código completo de cada botão:

01. Botão Ler Arquivo Texto
:

void BtnLerClick(object sender, EventArgs e)
{
try
{

var consulta =
from linha in
File.ReadAllLines(caminhoArquivo)
let clienteDados =
linha.Split(',')
select new Cliente()
{

Nome = clienteDados[0],
Email =
clienteDados[1],
Cidade = clienteDados[2],

Pais = clienteDados[3],
};


foreach (var item in consulta)
{

lstTexto.Items.Add(item.Nome +","+ item.Email + ","+ item.Cidade + ","+
item.Pais);
}
}
catch (Exception ex)
{

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

02. Botão Filtrar por Pais:

void Button1Click(object sender, EventArgs e)
{
try
{

var consulta =
from c in

(from linha in File.ReadAllLines(caminhoArquivo)
let
clientesDados = linha.Split(',')
select new
Cliente()
{
Nome =
clientesDados [0],
Email = clientesDados [1],

Cidade = clientesDados [2],

Pais = clientesDados [3],
})
where
c.Pais == "USA"

select c;

lstTexto.Items.Add(" - - - - Filtro por Pais: - - - - -")

foreach (var item in consulta)
{

lstTexto.Items.Add(item.Nome +","+ item.Email + ","+ item.Cidade + ","+
item.Pais);
}
}
catch (Exception ex)
{

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

03. Botão Filtrar Email:

void Button2Click(object sender, EventArgs e)
{
try

{
var consulta =
from c
in
(from linha in
File.ReadAllLines(caminhoArquivo)
let
clientesDados = linha.Split(',')
select new
Cliente()
{
Nome =
clientesDados [0],
Email = clientesDados
[1],
Cidade = clientesDados [2],

Pais = clientesDados [3],
})

where c.Email.Contains("net")

select c;

lstTexto.Items.Add(" - - - - Filtro por
Email: - - - - -")
foreach (var item in consulta)
{

lstTexto.Items.Add(item.Nome +","+ item.Email + ","+ item.Cidade + ","+
item.Pais);
}
}
catch (Exception ex)
{

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

Executando o projeto e clicando em
cada um dos botões iremos obter:

Você pode fazer o que quiser com os dados
lidos.
Salvar em um banco de dados, em um arquivo texto, etc…

Aguarde mais artigos sobre LINQ e pegue o
projeto
completo aqui: LerArquivoTexto.zip

Eu sei, é apenas C# e LINQ, mas eu
gosto…