Manipulando arquivo texto com .NET

Por Alexandre Tarifa

Mesmo com a criação de novos padrões de troca de dados como os arquivos XML, a utilização de arquivo texto para a integração de aplicações ainda é uma realidade. A maioria das empresas que possuem vários sistemas em vários ambientes e até mesmo em sistemas operacionais diferentes adota os arquivos texto para realizar a integração dos dados.

O Framework.Net traz todos os recursos necessários para a manipulação dos arquivos texto. Este artigo mostrará através de um cenário muito comum a utilização de alguns dos recursos disponíveis.

Cenário

Um sistema "A" possui um cadastro de funcionários que deverá ser compartilhado com um sistema "B" e será utilizado arquivo texto para esta tarefa. O primeiro passo é a definição de um leiaute padrão para a troca dos arquivos. Como se trata de um arquivo estruturado será criado colunas com um tamanho fixo de caracteres onde cada coluna receberá uma informação específica.

Leiaute - Cadastro de Funcionários

Coluna 1
Descrição: Matrícula do funcionário
Tamanho: 6 caracteres

Coluna 2
Descrição: Nome do funcionário
Tamanho: 150 caracteres

Coluna 3
Descrição: Cargo do Funcionário
Tamanho: 50 caracteres

Sistema "A"

O sistema "A" é responsável pela criação dos arquivos e pela transmissão dos dados, ou seja, criará o arquivo texto e alimentará com os valores de uma tabela de banco de dados.

Abra o Visual Studio, selecione New Project, Visual Basic Projects e Windows Application com o nome:
ArquivoTexto (figura 1).

Cc580598.manipulando_texto_f01(pt-br,MSDN.10).jpg
Figura 1. Criação do projeto.

Remova o Form1 no Solution Explorer. Adicione um novo formulário, clique com o botão direito do mouse sobre o projeto, add, add Windows Forms com o nome frmSistemaA.

Altere as seguintes propriedades do formulário:

frmSistemaA

Font

Verdana; 8,25pt

Text

Sistema "A"

StartPosition

CenterScreen

Tabela 1. Propriedades do formulário.

Adicione todos os controles conforme a figura 2 e altere todas as propriedades conforme a tabela 2
Cc580598.manipulando_texto_f02(pt-br,MSDN.10).gif
Figura 2. Leiaute do formulário

1

TextBox

Name

txtCaminho

BorderStyle

FixedSingle

Text

C:\Teste.txt

2

Button

Name

btnGerar

Text

Gerar Arquivo - Funcionários

Tabela 2. Propriedades dos controles

O objetivo deste formulário será de criar o arquivo texto no caminho digitado no TextBox. Os valores que serão inseridos no arquivo texto terão como origem uma tabela chamada tblFuncionario de um banco de dados SQL Server chamado dbArtigo com a estrutura abaixo:

funMatricula

Tipo

Varchar(6)

funNome

Tipo

Varchar(150)

funCargo

Tipo

Varchar(50)

Tabela 3. Tabela de funcionários

Insira alguns registros na tabela para alimentar o arquivo texto.

O botão Gerar Arquivo terá como funcionalidade principal se conectar com o banco de dados e transferir os valores para o arquivo texto. Insira no topo do código (F7) as referências:

Imports System.IO
Imports System.IO.StreamWriter
Imports System.Data.SqlClient

De um duplo clique sobre o botão e digite o seguinte código:

Private Sub btnGerar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGerar.Click

      'Declara uma variável do tipo File (Arquivo)
      Dim ArquivoTexto As File
      'Declara uma variável do tipo StreamWriter
      Dim Escrita As StreamWriter

      'Verifica se já existe um arquivo com este nome
      If File.Exists(txtCaminho.Text) Then
          MsgBox("Este arquivo já existe")
          Exit Sub
      End If

      'Cria um novo arquivo de acordo com o nome digitado e passa para o objeto StremWriter
      Escrita = ArquivoTexto.CreateText(txtCaminho.Text)

      'Cria uma conexão com o Banco de Dados
      'Recupera os valores dos funcionários em um DataReader

      Dim Conn As New SqlConnection
      With Conn
          .ConnectionString = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=dbArtigo;Data Source=local"
          .Open()
      End With

      Dim cmd As New SqlCommand("Select funMatricula, funNome, funCargo from tblFuncionario", Conn)

      Dim dr As SqlDataReader
      dr = cmd.ExecuteReader

      'Faz um loop no DataReader inserindo linha a linha no arquivo texto
      Do While dr.Read
          'Escreve a linha com os valores desejados
          Escrita.WriteLine("{0,-6}{1,-150}{2,-50}", dr("funMatricula").ToString, dr("funNome").ToString, dr("funCargo").ToString)
      Loop

      'Libera a utilização do arquivo
      Escrita.Close()

      MsgBox("Arquivo gerado com sucesso")

   End Sub

Execute a aplicação, digite um caminho válido de um arquivo e clique em gerar arquivo. Após a execução, abra o arquivo no Notepad conforme imagem abaixo:

Cc580598.f03(pt-br,MSDN.10).jpg
Figura 3. Arquivo gerado.

Sistema "B"

O sistema "B" é responsável pela leitura do arquivo e pela inserção dos dados, ou seja, vai ler o arquivo texto e inserir os valores dentro da sua base de dados.

Adicione um novo formulário, clique com o botão direito do mouse sobre o projeto, add, add Windows Forms com o nome frmSistemaB.

Altere as seguintes propriedades do formulário:

frmSistemaA

Font

Verdana; 8,25pt

Size

464; 200

Text

Sistema "B"

StartPosition

CenterScreen

Tabela 4. Propriedades do formulário.

Adicione todos os controles conforme a figura 4 e altere todas as propriedades conforme a tabela 5
Cc580598.f04(pt-br,MSDN.10).gif
Figura 4. Leiaute do formulário

1

TextBox

Name

txtCaminho

BorderStyle

FixedSingle

Text

C:\Teste.txt

2

Button

Name

btnLer

Text

Ler Arquivo - Funcionários

Tabela 5. Propriedades dos controles

Os dados lidos no arquivo texto será transferido para uma outra tabela chamada tblFuncionarioB com a estrutura abaixo:

funMatricula

 

Tipo

Varchar(6)

funNome

 

Tipo

Varchar(150)

funCargo

 

Tipo

Varchar(50)

Tabela 6. Tabela de funcionáriosB

O botão Ler Arquivo terá como funcionalidade principal ler os registros do arquivo solicitado e transferir os valores para o banco de dados na tabela tblFuncionarioB. Insira no topo do código (F7) as referências:

Imports System.IO
Imports System.IO. StreamReader
Imports System.Data.SqlClient

De um duplo clique sobre o botão e digite o seguinte código:

Private Sub btnLer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLer.Click

        'Declara uma variável do tipo File (Arquivo)
        Dim ArquivoTexto As File
        'Declara uma variável do tipo StreamWriter
        Dim Leitura As StreamReader

        'Verifica se já existe um arquivo com este nome
        If File.Exists(txtCaminho.Text) = False Then
            MsgBox("Este arquivo não existe")
            Exit Sub
        End If

        'Cria um novo arquivo de acordo com o nome digitado e passa para o objeto StremWriter
        Leitura = ArquivoTexto.OpenText(txtCaminho.Text)

        'Declara as variáveis dos campos
        Dim strLinha, strMatricula, strNome, strCargo As String

        'Faz um loop dentro das linhas do arquivo
        While (Leitura.Peek() > -1)

            'Parra toda a linha atual para uma variável 
            strLinha = Leitura.ReadLine

            'Recupera os valores de acordo com o posicionamento
            strMatricula = strLinha.Substring(0, 6)
            strNome = strLinha.Substring(6, 150)
            strCargo = strLinha.Substring(156, 50)

            'Faz a conexão com o Banco de dados
            Dim Conn As New SqlConnection
            With Conn
                .ConnectionString = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=dbArtigo;Data Source=local"
                .Open()
            End With

            'Insere os valores no Banco de Dados - Tabela do Sistema B
            Dim cmd As New SqlCommand("insert into tblFuncionarioB values ('" & strMatricula.Trim & "', '" & strNome.Trim & "', '" & strCargo.Trim & "')", Conn)
            cmd.ExecuteNonQuery()

        End While

        Leitura.Close()

        MsgBox("Base atualizada com sucesso")

  End Sub

Para testar, vá no Solution Explorer, clique com o botão direito do mouse sobre o projeto, Properties, Startup Project selecione frmSistema B, execute a aplicação (F5) e clique no botão Ler Arquivo.

Pronto, a transmissão dos dados foram concluídas, para confirmar faça uma consulta no banco de dados e verifique se existem os valores iguais nas duas tabelas (tblFuncionarioA e tblFuncionarioB).

Conclusão

Utilizar arquivos textos ainda é uma realidade e muitas empresas continuarão utilizando, o Framework.Net traz recursos suficientes para de uma forma bem simples manipular os arquivos.

Alexandre Tarifa
alexandretarifa@dotnetsistemas.com.br
Analista de Sistemas, Líder do grupo de usuários Codificando.net São Paulo (http://sp.codificando.net).
Bacharel em Ciência da Computação e pós-graduando em desenvolvimento de software para Web (UFSCAR). Visite o meu The spoke:
http://br.thespoke.net/MyBlog/alexandretarifa/MyBlog.aspx e meu site www.alexandretarifa.eti.br.