VB.NET - Lendo arquivos Textos delimitados e preenchendo listas
A correria do dia a dia , a falta de tempo e a grande competitividade e pressão a que estamos submetidos muitas vezes fazem com que tomemos atitudes e realizamos tarefas de forma automática , sem pensar muito no que estamos fazendo. |
Isto se torna mais crítico para o programador que no dia a dia esta submetido a codificar centenas de centenas de linhas de código.
Tarefas simples que exigiriam poucas linhas de código ás vezes são feitas com dezenas ou centenas de linhas só por que é mais fácil copiar e colar aquela função que eu já usei naquele sistema. A utilização de banco de dados na grande maioria das aplicações faz com que tenhamos a tendência de usar tabelas e banco de dados para qualquer tarefa que em muitas vezes um arquivo texto ou xml seria a solução.
Um exemplo clássico seria as tabelas de consultas quando temos itens que praticamente não necessitam de manutenção apenas de leitura. Uma tabela de estados da federação é o exemplo mais claro. A frequência de alteração em uma tabela com os estados brasileiros é baixíssima não havendo necessidade de rotinas para incluir , excluir e alterar dados. Então por que eu vou criar uma tabela com os nomes dos estados brasileiros se posso usar um arquivo texto que muito mais leve e onera muito menos a minha aplicação ?
Neste artigo vou mostrar como podemos preencher listas usando arquivos textos delimitados. A tarefa envolvida na operação praticamente resume-se a:
abrir o arquivo texto
ler o arquivo texto
carregar a lista com os dados do arquivo
Um arquivo texto delimitado é aquele cujo conteúdo possui um delimitador que pode ser uma palavra , letra , número , tab ou espaço. Geralmente o nome do arquivo é dado de acordo com o delimitador usado. Assim se o delimitador for uma vírgula (,) o arquivo será conhecido como delimitado por vírgula (comma-delimited) e terá a seguinte estrutura :
Valor1, Valor2, Valor3, Valor4, Valor5
Já um arquivo delimitado por tab terá a seguinte estrutura : Valor1 Valor2 Valor3 Valor4 Valor5
Vamos então criar um arquivo delimitado por vírgula com o nome de estados.txt com a seguinte estrutura:
Acre, Amazonas, Bahia , Ceará, São Paulo, Rio de Janeiro, Minas Gerais, Rio Grande do Sul, Tocantins
Você pode usar qualquer editor de textos para esta finalidade.
A próxima etapa é criar um projeto novo projeto no Visual Studio.NET com as seguintes características (sinta-se a vontade para alterar a seu gosto.)
Como o objetivo é preencher listas podemos usar os seguintes controle de listas : combobox , listbox , listview , etc... Por questão de simplicidade vou usar um controle ListBox no formulário padrão - form1.vb. Monte o formulário conforme a figura abaixo.
Vamos agora criar o código que deverá abrir o arquivo texto delimitado , ler o arquivo e carregar os dados no ListBox.
Para abrir e ler um arquivo texto e ler linhas do mesmo você pode usar a classe StreamReader , ela implementa um TextReader que representa um leitor que pode ler uma série sequencial de caracteres. a partir de um fluxo de bytes. Ela é especializada em receber entrada de caracteres em uma codificação particular; o padrão é o formato UTF-8 que trata caracteres Unicode corretamente e fornece um resultado consistente em versões localizadas do sistema operacional. (Se você precisar ler bytes deve usar a classe Stream).
- Você deve declarar uma variável do tipo StreamReader e usando a classe File que fornece métodos estáticos para criar , copiar , excluir mover e abrir arquivos vamos abrir o arquivo usando o método OpenText que abre o arquivo texto para leitura.
- Após ler todo o conteúdo do arquivo texto usando o método ReadToEnd que do início ao fim do fluxo de dados. (Para ter um maior controle sobre os caracteres lidos você pode usar o método Read(char[]))
- Após a leitura do arquivo devemos separar cada estado usando a função Split. Esta função retorna um array dimensional com índice inicial igual a zero contendo um número definido de substrings.
Abaixo temos o código completo para realizar esta tarefa. Você pode colocá-lo no evento Click do botão de comando ou no evento Load do formulário.
Dim arquivo As String arquivo = "c:\teste\estados.txt" Dim arqTemp As StreamReader arqTemp = File.OpenText(arquivo) Dim conteudoLido As String conteudoLido = filestream.ReadToEnd() Dim delimitador As String delimitador = "," Dim conteudoLista = Split(conteudoLido, delimitador) Dim i As Integer For i = 0 To UBound(conteudoLista) ListBox1.Items.Add(conteudoLista(i)) Next arqTemp.Close()
|
Eu ia encerrar o artigo aqui mas não aguentei olhar o código acima. Ele é muito feio.
Com certeza você pode fazer coisa melhor afinal você é um programador VB.NET e VB.NET é uma linguagem OOP. Por que então ficar poluindo o formulário com este monte de linha de código se eu posso criar uma classe que faz o serviço de forma mais elegante ?
No menu Project selecione Add Class e informe o nome LeArqtxt.vb para esta classe. A seguir crie uma classe com o método estático LerArquivo que recebe dois argumentos : o nome do arquivo e o delimitador usado.
Devemos tratar a exceção FileNotFoundException , pois se o arquivo não existir teremos uma mensagem de erro.
Public Class LeArqTxt Public Shared Function lerArquivo(ByVal arquivo As String, ByVal delimitador As String) Try Return Split(System.IO.File.OpenText(arquivo).ReadToEnd(), delimitador) Catch e As FileNotFoundException MessageBox.Show("Erro = " & e.Message, "Não Localizado", MessageBoxButtons.OK, MessageBoxIcon.Error, _ MessageBoxDefaultButton.Button1) End Try End Function End Class
|
A seguir usamos a classe criada inserindo o código abaixo no evento Click do botão de comando - Preenche Lista.
Private
Sub Button1_Click(ByVal
sender As System.Object,
ByVal e
As System.EventArgs)
Handles Button1.Click ListBox1.DataSource = LeArqTxt.lerArquivo("c:\teste\estados.txt", ",") End Sub |
Olhe bem para o código acima e veja como estamos fazendo o preenchimento do ListBox : nada de usar for/next e ListBox1.Items.Add. Estou passando o nome do arquivo e o delimitador para o método da classe LeArquivo.
Para preencher a lista estou apenas definindo a propriedade DataSource do controle como sendo igual ao array retornado pelo método lerArquivo da classe LeArqTxt. Fazendo assim você acabou de usar o DataBinding do VB.NET. A princípio você pode fazer o binding para qualquer controle que implemente a interface IList , e um array implementa esta interface. O resultado final é o seguinte.
Nota:
Não precisei instanciar um objeto da classe
LeArqTxt pois o método LerArquivo é estático. A palavra chave Shared indica que um ou mais elementos são estáticos. Elementos Shared não estão associados com uma instância específica de uma classe ou estrutura e podem ser acessados através da qualificação do nome da classe ou estrutura como fizemos.
|
Até o próximo artigo...
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 ? |
Gostou ? Compartilhe no Facebook Compartilhe no Twitter
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
VB.NET - Programando Socket com Multithreads - Macoratti ...