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