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:

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.)

  1. Project Types : Visual Basic .NET
  2. Templates : Windows Application
  3. Name : LeArqTxt
  4. Location : c:\vbnet\LeArqTxt

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:


José Carlos Macoratti