Desenvolvimento - Visual Fox Pro

Importando arquivos “Textos” com FOX e VB ou Delphi

O objetivo deste artigo é mostrar um método de importação de arquivos textos, padrão ASCII, com delimitador, independente da linguagem de programação utilizada na sua aplicação.

por Etelvino Costa Santos



O objetivo deste artigo é mostrar um método de importação de arquivos textos, padrão ASCII, com delimitador, independente da linguagem de programação utilizada na sua aplicação.

Quem desenvolve sistemas em VB ou Delphi, por exemplo, geralmente depara-se com a necessidade de importar para um banco de dados, gerenciado pelo Access ou Paradox entre outros, algumas informações que estão armazenadas em um arquivo texto, de forma rápida e de fácil adaptação para outras rotinas do sistema.

Partindo desta necessidade, encontrei no Fox uma solução interessante. Com poucas linhas de programação é possível transformar arquivos textos em bancos de dados, no formato DBF (Data Base File). E a performance é extremamente rápida. Para se ter uma idéia, um arquivo texto com 80 colunas e 60.000 linhas, leva apenas 3 segundos para importar de texto para DBF, utilizando o Fox e rodando o programa em um Pentium de 2Ghz.

A idéia é simples. SOMAR FORÇAS! Primeiro importa-se do arquivo texto para o DBF utilizando um programa escrito em Fox, depois importa-se do DBF para o banco de dados de sua aplicação.

No exemplo usaremos um programa feito em VB6, e como banco de dados final, o MDB (Access). O arquivo texto para a demonstração será o "teste.csv":

Conteúdo do arquivo teste.csv:

1;01/04/2004;1000000001;31/03/2004;ASDFASDFASDFASDFASDF;0006655
2;02/04/2004;1000000002;01/04/2004;asdfasdfasd;0065499
3;03/04/2004;1000000003;02/04/2004;qwerqwerqwerqwerq;0008789
4;04/04/2004;1000000004;03/04/2004;ASDFASDFASDFASDFASDF;0029115
5;05/04/2004;1000000005;04/04/2004;asdfasdfasd;0030182
6;06/04/2004;1000000006;05/04/2004;qwerqwerqwerqwerq;0031249
7;07/04/2004;1000000007;06/04/2004;ASDFASDFASDFASDFASDF;0032316
8;08/04/2004;1000000008;07/04/2004;asdfasdfasd;0033383
9;09/04/2004;1000000009;08/04/2004;qwerqwerqwerqwerq;0034450
10;10/04/2004;1000000010;09/04/2004;ASDFASDFASDFASDFASDF;0035517

Copie o trecho acima, abra o Notepad, e cole. Salve como teste.csv em uma pasta como "C:\Import" (nossa pasta de trabalho).

Dica: Para perceber a velocidade da rotina, abra pelo Excell, o arquivo teste.csv. Observe que o Excell identificou o delimitador ";" e automaticamente distribuiu nas células. Selecione a última linha e copie até + ou - a linha 50.000. Salve em CSV.

Primeira parte: Importando do Texto para o DBF.

Para o exemplo, vamos importar o arquivo "texto.csv" utilizando um programa que fiz em Fox 6.0, chamado "Import.EXE". Para ele funcionar, é necessário que 3 arquivos acompanhe o Import.EXE. São eles: VFP6R.DLL, VFP6RENU.DLL e VFP6RUN.EXE. Estes arquivos são "Runtimes" que acompanham o Fox. O programa Import.EXE e os runtimes podem ser baixados no final deste artigo, seção "Downloads".

Desta forma, a pasta "C:\Import" terá os arquivos: Teste.CSV, Import.EXE, VFP6R.DLL, VFP6RENU.DLL e VFP6RUN.EXE.

Parâmetros do Import.EXE:

O programa Import.EXE requer 4 parâmetros:

1) Caminho do arquivo: No nosso exemplo será C:\Import
2) Nome do arquivo a ser importado: Teste.csv
3) Delimitador utilizado: qualquer caractere, no nosso caso o ponto-e-vírgula (;)
4) Estrutura do arquivo: "N010C010N010D010C050N007"
Onde a letra representa o tipo do campo, sendo:
N = Numérico, C = Caractere e D=Data (somente no formato dd/mm/aaaa)
E o número representa o tamanho do campo

Dica: Você pode testar a importação através do Prompt do DOS. Digite na linha de comando abaixo e cuidado com os espaços, são fundamentais para separar os parâmetros:

import C:\import teste.csv ; N010C010N010D010C050N007

O processo de importação resultou em um arquivo chamado "teste.DBF", que pode ser aberto pelo Excell. O formato dele é D"Base III.

A maioria das linguagens de programação executa outros programas, portanto basta passar os parâmetros e pronto!

Para quem sabe usar o Fox pode compilar o código fonte do programa Import.EXE e até melhorar!

Veja como é o código fonte:

***************************************************************
* Nome : Import.prg
* Data : 07/05/2004
* Autor: cibertel@uol.com.br
* Obs. : Programa para importar arquivos TXT para DBF (Dbase5)
* 	 Requer Parametros: Caminho e nome do arquivo
*			    Delimitador (;,| tab...)
* 			    Campos e tipos: C010N10
***************************************************************

Param sPath, sArq, sDelimit, sTipos
sCampos = ""
Ind=0

Set Safe OFF
Set Talk OFF
SET DATE BRIT

* Monta a string de campos
for X=1 to len(sTipos) step 4
	Ind = Ind+1
	
	cCampo = Subst(sTipos, X, 4)
	sTipo = Left(cCampo, 1)
	sTam = Subst(cCampo, 2, 3)
	
	sCampos = sCampos + "Campo" + alltrim(str(Ind, 10, 0)) + " " + sTipo + "(" + sTam + "), "
next
* Retira a última vírgula
sCampos = " (" + Left(sCampos, Len(sCampos)-2) + ")"

* Cria o BD de Saída
set defa to &sPath

* Apaga o arquivo TEMP.DBF auxiliar
If File( Temp.DBF )
	Dele File Temp.DBF
Endif

* Cria o BD de Saída
sArqDBF = Left(sArq, Len(sArq)-4)
Create Table Temp.DBF &sCampos 

Append From &sArq Deli With char &sDelimit 

* Converte em DBF IV
If File( sArqDBF )
	Delete File &sArqDBF
Endif
Copy to &sArqDBF foxplus

Close all

Dele File Temp.DBF

Return("OK")
****** Fim do Programa Import.EXE ********

Segunda parte: Importando do DBF para o MDB (Access).

O programa "vbImport" escrito em VB6 serve para ilustrar o método, mas pode ser desenvolvido em outra linguagem.


Fig 01: Tela do programa vbImport, desenvolvido em VB

Você pode pegar o executável do programa "vbImport" e a DLL necessária "DAO360.dll" na seção final "Downloads" ou criar um novo projeto no VB, adicionar um novo formulário e montar como aparece na figura 01.

Se optar em montar o projeto no VB e aproveitar o código abaixo, é necessário manter a nomenclatura dos objetos.

Para os "TextBox" utilize o nome na seqüência: txtPath, txtArquivo, txtDeli, txtEstru, txtMDB, txtTabela.

Para o "Label" de mensagens: lblMens.

O botão "Sair" deve-se chamar "cmdSair" e escreva END no evento "click()", para finalizar o programa.

O código do programa é bem simples, mas requer o "Microsoft DAO 3.6 Object Library" ( ou 3.5) para acessar o banco de dados, que pode ser adicionado no projeto pelo menu "Project\References".

O botão "Importar" deve-se chamar "cmdImport" e ter o código abaixo:

"************ Início do Programa ***************

Private Sub cmdImport_Click()

Dim DB As Database
Dim sArqDBF As String
Dim sArqMDB As String
Dim sSQL As String
Dim HoraIni As Date
Dim HoraFin As Date

"Importa o TXT para DBF
On Error GoTo ERRO
HoraIni = Time

"Ver se o arquivo está na pasta
If Dir(App.Path & "\import.exe") = "" Or Dir(App.Path & "\VFP6R.DLL") = "" _
  Or Dir(App.Path & "\VFP6RENU.DLL") = "" Or Dir(App.Path & "\VFP6RUN.EXE") = "" Then
    MsgBox "O programa de importação "import.exe" não está na mesma pasta que este programa!" & Chr(13) 
& Chr(13) & "Verifique se os arquivos abaixo estão na mesma pasta:" & Chr(13) & "VFP6R.DLL" & Chr(13) & 
"VFP6RENU.DLL" & Chr(13) & "VFP6RUN.EXE" & Chr(13) & "import.EXE", vbExclamation, "AVISO"
    Exit Sub
End If

"Executa o programa Import.EXE com os devidos parâmetros
sRet = _
 Shell(App.Path & "\import.exe " & txtPath & " " & txtArquivo & " " & txtDeli & " " & txtEstru, vbHide)

"Registra o tempo de processamento do DBF
HoraFin = Time
lblMens.Caption = "Tempo de Processamento: TXT->DBF: " & Format((HoraFin - HoraIni), "hh:mm:ss")

sArqDBF = Left(txtArquivo.Text, Len(txtArquivo.Text) - 3) & "dbf"
sArqMDB = txtMDB

"Cria um novo banco de dados e apaga se já existir. Para efeito de demonstração
If Dir(txtPath.Text & "\" & sArqMDB) <> "" Then Kill txtPath.Text & "\" & sArqMDB
Set DB = CreateDatabase(txtPath.Text & "\" & sArqMDB, dbLangGeneral, dbEncrypt)
DB.Close

"Inclui no MDB o arquivo DBF
HoraIni = Time

Set DB = OpenDatabase(txtPath.Text, False, False, "DBase IV")
sSQL = "SELECT * INTO " & txtTabela & " IN "" & txtPath.Text & "\" & sArqMDB & "" FROM " & _
  Left(txtArquivo.Text, Len(txtArquivo.Text) - 4) & ";"
DB.Execute sSQL

"Registra o tempo de processamento do MDB
HoraFin = Time
lblMens.Caption = lblMens.Caption & " | DBF->MDB: " & _
 Format((HoraFin - HoraIni), "hh:mm:ss") & " - Reg: " & DB.RecordsAffected

"Fecha o BD
DB.Close

Beep
MsgBox "Pronto !!!", vbInformation, "AVISO"

Exit Sub

"Trata possíveis erros
ERRO:
    MsgBox Err.Description, Err.Number, "ERRO"
    On Error GoTo 0
End Sub

"************ Fim do Programa ***************

Os códigos fontes dos programas "Import" e "vbImport" estão bem comentados. Para quem entende estas linguagens não terá dificuldade para implementar. Se preferir, lembre-se que você pode optar por utilizar os executáveis.

Não vou aprofundar na explicação de cada linha dos códigos fontes, pois assim estaria fugindo do foco deste artigo, onde o nosso objetivo é demonstrar o método de importação de arquivos textos, extraindo o máximo proveito das linguagens de programação, ainda que os programas sejam desenvolvidos em linguagens diferentes.

É claro que os dois programas podem ser melhorados e adaptados para cada necessidade em particular. Esta é mais uma vantagem deste método, pois facilita o reaproveitamento de código, agilizando a implantação de novos programas.

Se alguém souber de alguma forma de importar arquivos textos tão rápido como o Fox, utilizando outra linguagem, por favor me conte. Principalmente se a solução rodar em Linux!

Manifesto:

Nem sempre a Microsoft procura unificar as melhores qualidades de seus produtos e disponibilizar em um único. Como por exemplo, o Fox é rápido para processar arquivos, mas não tem tantos recursos de programação como o Visual Basic. Ela tenta empurrar o .Net, pois é fácil para o programador, mas é obsoleto por não ser multi-plataforma. E assim por diante...

Downloads:

importEXE.zip: Programas executáveis. Contém o "Import.EXE", "vbImport.EXE" e o "teste.csv";

ImportFONTE.zip: Contém os fontes dos projetos "Import.EXE", "vbImport.EXE";

VFP6RUN.zip: Contém os runtimes necessários para rodar o programa "Import.EXE" e "vbImport.EXE".

Etelvino Costa Santos

Etelvino Costa Santos - Analista de Sistemas Bacharel em Ciência da Computação.