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<br />{<br /> public string Nome { get; set; }<br /><br /> public string Email { get; set; }<br /> public string cidade { get; <br />set; }<br /> public string Pais { get; set; }<br />}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)<br />{<br /><br />string caminhoArquivo = "<a>C:\\dados\\Clientes.txt</a>";<br /><br /> var consulta =<br /> from linha in <br />File.ReadAllLines(caminhoArquivo)<br /> let clienteDados = <br />linha.Split(',')<br /> select new Cliente()<br /> {<br /><br /> Nome = clienteDados[0],<br /> Email =<br /> clienteDados[1],<br /> Cidade = clienteDados[2],<br /><br /> Pais = clienteDados[3],<br /> };<br /><br /><br /> foreach (var item in consulta)<br /> {<br /><br />lstTexto.Items.Add(item.Nome +","+ item.Email + ","+ item.Cidade + ","+ <br />item.Pais);<br /> }<br />}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.
<strong>public static<br /> string[] ReadAllLines ( string path )</strong>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 =<br /> from c in<br /> (from linha <br />in File.ReadAllLines(caminhoArquivo)<br /> let clientesDados =<br /> linha.Split(',')<br /> select new Cliente()<br /><br /> {<br /> Nome = clientesDados [0],<br /><br /> Email = clientesDados [1],<br /> Cidade = <br />clientesDados [2],<br /> Pais = clientesDados [3],<br /><br /> })<br /> where c.Pais == "USA"<br /> select <br />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 =<br /> from c in<br /> (from linha <br />in File.ReadAllLines(caminhoArquivo)<br /> let clientesDados =<br /> linha.Split(',')<br /> select new Cliente()<br /><br /> {<br /> Nome = clientesDados [0],<br /><br /> Email = clientesDados [1],<br /> Cidade = <br />clientesDados [2],<br /> Pais = clientesDados [3],<br /><br /> })<br /> where c.Email.Contains("net")<br /><br />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)<br />{<br /> try<br /> {<br /><br /> var consulta =<br /> from linha in <br />File.ReadAllLines(caminhoArquivo)<br /> let clienteDados = <br />linha.Split(',')<br /> select new Cliente()<br /> {<br /><br /> Nome = clienteDados[0],<br /> Email = <br />clienteDados[1],<br /> Cidade = clienteDados[2],<br /><br /> Pais = clienteDados[3],<br /> };<br /><br /><br />foreach (var item in consulta)<br /> {<br /><br />lstTexto.Items.Add(item.Nome +","+ item.Email + ","+ item.Cidade + ","+ <br />item.Pais);<br /> }<br /> }<br /> catch (Exception ex)<br /> {<br /><br />MessageBox.Show(" Erro : " + ex.Message);<br /> }<br />}02. Botão Filtrar por Pais:
void Button1Click(object sender, EventArgs e)<br />{<br /> try<br /> {<br /><br /> var consulta =<br /> from c in<br /><br />(from linha in File.ReadAllLines(caminhoArquivo)<br /> let<br /> clientesDados = linha.Split(',')<br /> select new <br />Cliente()<br /> {<br /> Nome = <br />clientesDados [0],<br /> Email = clientesDados [1],<br /><br /> Cidade = clientesDados [2],<br /><br /> Pais = clientesDados [3],<br /> })<br /><strong>where<br /> c.Pais == "USA"</strong><br /><strong> select c;</strong><br /><br /> lstTexto.Items.Add(" - - - - Filtro por Pais: - - - - -") <br /><br /> foreach (var item in consulta)<br /> {<br /><br />lstTexto.Items.Add(item.Nome +","+ item.Email + ","+ item.Cidade + ","+ <br />item.Pais);<br /> }<br /> }<br /> catch (Exception ex)<br /> {<br /><br />MessageBox.Show(" Erro : " + ex.Message);<br /> }<br />}03. Botão Filtrar Email:
void Button2Click(object sender, EventArgs e)<br />{<br /> try<br /><br /> {<br /> var consulta =<br /> from c <br />in<br /> (from linha in <br />File.ReadAllLines(caminhoArquivo)<br /> let <br />clientesDados = linha.Split(',')<br /> select new <br />Cliente()<br /> {<br /> Nome =<br /> clientesDados [0],<br /> Email = clientesDados <br />[1],<br /> Cidade = clientesDados [2],<br /><br /> Pais = clientesDados [3],<br /> })<br /><br /><strong> where c.Email.Contains("net")</strong><br /><strong><br /> select c;</strong><br /> lstTexto.Items.Add(" - - - - Filtro por <br />Email: - - - - -") <br /> foreach (var item in consulta)<br /> {<br /><br />lstTexto.Items.Add(item.Nome +","+ item.Email + ","+ item.Cidade + ","+ <br />item.Pais);<br /> }<br /> }<br /> catch (Exception ex)<br /> {<br /><br /> MessageBox.Show(" Erro : " + ex.Message);<br /> }<br />}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…








