Desenvolvimento - Visual Fox Pro
Importando arquivos “Textos” com FOX e VB ou Delphi
por Etelvino Costa Santos
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".
- Implementando a nova “Barras de Dados” do Excel 2007 no Grid do Microsoft Visual FoxProVisual Fox Pro
- Calculando valor do SEDEX on-line com Microsoft Visual FoxProVisual Fox Pro
- Criando, formatando e imprimindo gráficos no Visual FoxPro com o Microsoft GraphVisual Fox Pro
- WEB Services com Visual FoxPro 9.0Visual Fox Pro








