Importação de Arquivo TXT para DBF
Moderador: Moderadores
Importação de Arquivo TXT para DBF
Olá, pessoal!
Tenho um arquivo TXT contendo os dados de batidas de ponto de funcionários já delimiitadas. Sei o tamanho de cada campo na linha e sei que cada linha corresponde a um registro.
Alguém tem idéia de como fazer para abrir e ler linha a linha do TXT até o final do arquivo para importar isso tudo para um arquivo DBF?
Como tenho mais perguntado do que dado sugestões neste fórum, prometo que, assim que meus sistemas de Gestão Empresarial e Depto. Pessoal estiverem prontos, eu os ponho aqui no fórum, tá?
Valeu!
Tenho um arquivo TXT contendo os dados de batidas de ponto de funcionários já delimiitadas. Sei o tamanho de cada campo na linha e sei que cada linha corresponde a um registro.
Alguém tem idéia de como fazer para abrir e ler linha a linha do TXT até o final do arquivo para importar isso tudo para um arquivo DBF?
Como tenho mais perguntado do que dado sugestões neste fórum, prometo que, assim que meus sistemas de Gestão Empresarial e Depto. Pessoal estiverem prontos, eu os ponho aqui no fórum, tá?
Valeu!
- Augusto
- Usuário Nível 3

- Mensagens: 473
- Registrado em: 26 Ago 2003 17:50
- Localização: Maricá/RJ
- Contato:
Parceiro...
A primeira coisa que deve fazer é criar o DBF com a estrutura igual a que vc tem no TXT, respeitando o tipo de cada campo que irá receber os dados. Feito isso...
A primeira coisa que deve fazer é criar o DBF com a estrutura igual a que vc tem no TXT, respeitando o tipo de cada campo que irá receber os dados. Feito isso...
Código: Selecionar todos
use SEU_DBF
append from SEU_TXT delimited
close data
return:xau Fui...
goulart@provsul.com.br
Faça da PROVSUL o seu Provedor de Serviços WEB
Visite: www.PROVSUL.com.br
goulart@provsul.com.br
Faça da PROVSUL o seu Provedor de Serviços WEB
Visite: www.PROVSUL.com.br
-
Dércio_Luiz_Zanatta
- Usuário Nível 3

- Mensagens: 153
- Registrado em: 11 Jan 2006 15:37
- Localização: Ibirubá - RS
Eu faço um pouquinho diferente que o amigo, mas da no mesmo.
Eu crio um Dbf com um único campo Char com o tamanho do registro no arquivo texto. Depois uso o APPEND FROM;
USE ARQIMP
APPEND FROM "TEXTO.TXT" ALL SDF
Depois disso leio o ARQIMP de "cabo a rabo" e vou pegando as informações com a função SUBSTR().
Espero ter ajudado.
Eu crio um Dbf com um único campo Char com o tamanho do registro no arquivo texto. Depois uso o APPEND FROM;
USE ARQIMP
APPEND FROM "TEXTO.TXT" ALL SDF
Depois disso leio o ARQIMP de "cabo a rabo" e vou pegando as informações com a função SUBSTR().
Espero ter ajudado.
Amigos
Eu não posso gravar tudo sobre o DBF que já tenho. Isso apagaria os dados que os usuários já modificaram no DBF.
Cheguei até a pensar em criar um DBF vazio, preenchê-lo e, depois, com esse DBF preenchido atualizar o DBF que já tenho. Mas costumo usar o menor número de arquivos possível.
O que eu preciso é ler o arquivo texto da primeira até a última linha, sendo que cada linha será gravada como um novo registro no DBF se o registro já não existir.
Sei que existem funções do próprio Clipper que possibilitam essa leitura linha-a-linha, mas não lembro quais são.
E Dércio, ão entendi. A sintaxe do SUBSTR não é
SUBSTR(<VARIAVEL>,<POSICAO_INICIAL>, <POSICAO_FINAL>?
Como você consegue ler o arquivo de cabo a rabo assim? Você pode postar aqui no fórum um trechinho do código?
Valeu, gente!
Eu não posso gravar tudo sobre o DBF que já tenho. Isso apagaria os dados que os usuários já modificaram no DBF.
Cheguei até a pensar em criar um DBF vazio, preenchê-lo e, depois, com esse DBF preenchido atualizar o DBF que já tenho. Mas costumo usar o menor número de arquivos possível.
O que eu preciso é ler o arquivo texto da primeira até a última linha, sendo que cada linha será gravada como um novo registro no DBF se o registro já não existir.
Sei que existem funções do próprio Clipper que possibilitam essa leitura linha-a-linha, mas não lembro quais são.
E Dércio, ão entendi. A sintaxe do SUBSTR não é
SUBSTR(<VARIAVEL>,<POSICAO_INICIAL>, <POSICAO_FINAL>?
Como você consegue ler o arquivo de cabo a rabo assim? Você pode postar aqui no fórum um trechinho do código?
Valeu, gente!
- Augusto
- Usuário Nível 3

- Mensagens: 473
- Registrado em: 26 Ago 2003 17:50
- Localização: Maricá/RJ
- Contato:
Até onde eu conheço o Clipper, se a sua "origem" é um TXT... não tem jeito... é isso que terá de ser feito... (usando a rotina que te passei)UKclipper escreveu:Cheguei até a pensar em criar um DBF vazio, preenchê-lo e, depois, com esse DBF preenchido atualizar o DBF que já tenho.
Vamos ver se algum parceiro com mais conhecimento que eu (o que não é difícil) tem uma solução que atenda a sua necessidade efetiva.
:xau Fui...
goulart@provsul.com.br
Faça da PROVSUL o seu Provedor de Serviços WEB
Visite: www.PROVSUL.com.br
goulart@provsul.com.br
Faça da PROVSUL o seu Provedor de Serviços WEB
Visite: www.PROVSUL.com.br
Usando a idéia do Dércio :
Até logo.
Marcelo
Código: Selecionar todos
SELE 1
USE CADASTRO INDE CADASTRO
SELE 2
USE ARQIMP
APPEND FROM "TEXTO.TXT" ALL SDF
DBGOTOP()
DO WHIL .NOT. EOF()
KKCOD=SUBSTR(CAMPO,1,6) // pega o código
KKNOM=SUBSTR(CAMPO,7,40) // pega o nome
KKEND=SUBSTR(47,50) // pega o endereço
KKCID=SUBSTR(97,30) // pega a cidade
SELE CADASTRO
DBSEEK(KKCOD)
IF FOUND()
DBAPPEND()
REPLACE CODIGO WITH KKCOD
REPLACE NOME WITH KKNOM
REPLACE ENDERECO WITH KKEND
REPLACE CIDADE WITH KKCID
ENDIF
SELE ARQIMP
SKIP
ENDDO
DBCLOSEALL()
Marcelo
Programador que é programador, quando tá de folga vai inventar função nova, fazer testes, ou seja... se divertir
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
O problema é que ele não quer importar tudo, ele quer apenas o que não exista no DBF de destino.
Até logo.
Marcelo
Até logo.
Marcelo
Programador que é programador, quando tá de folga vai inventar função nova, fazer testes, ou seja... se divertir
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
- filizola
- Usuário Nível 3

- Mensagens: 421
- Registrado em: 19 Ago 2003 20:10
- Localização: Belo Horizonte/MG
"Olá, pessoal!
Tenho um arquivo TXT contendo os dados de batidas de ponto de funcionários já delimiitadas. Sei o tamanho de cada campo na linha e sei que cada linha corresponde a um registro.
Alguém tem idéia de como fazer para abrir e ler linha a linha do TXT até o final do arquivo para importar isso tudo para um arquivo DBF?
Como tenho mais perguntado do que dado sugestões neste fórum, prometo que, assim que meus sistemas de Gestão Empresarial e Depto. Pessoal estiverem prontos, eu os ponho aqui no fórum, tá?
Valeu!"
Tenho um arquivo TXT contendo os dados de batidas de ponto de funcionários já delimiitadas. Sei o tamanho de cada campo na linha e sei que cada linha corresponde a um registro.
Alguém tem idéia de como fazer para abrir e ler linha a linha do TXT até o final do arquivo para importar isso tudo para um arquivo DBF?
Como tenho mais perguntado do que dado sugestões neste fórum, prometo que, assim que meus sistemas de Gestão Empresarial e Depto. Pessoal estiverem prontos, eu os ponho aqui no fórum, tá?
Valeu!"
"Um passo a frente, e já não estará mais no mesmo lugar..."
-
Dércio_Luiz_Zanatta
- Usuário Nível 3

- Mensagens: 153
- Registrado em: 11 Jan 2006 15:37
- Localização: Ibirubá - RS
O usuário CLIPPER postou muito bem o código da maneira que eu uso.
Desta maneira vc não estará importando(APPEND FROM) diretamente na sua tabela de dados, mas sim em uma tabela auxiliar com um único campo Char. Depois vc vai ler esta tabela auxiliar e gravar cfe desejado na sua tabela definitiva. Ta bem claro na postagem do colega CLIPPER.
Existe uma forma de ler um arquivo texto sem usar uma tabela DBF auxiliar. Trata-se dos comandos FOPEN(),FSEEK(),FREAD(),FCLOSE().. etc.. do próprio clipper, porém é muito mais complicado ( ai sim é que é gostar de sofrer ehehe).
Um grande abraço.
Dércio Zanatta
Desta maneira vc não estará importando(APPEND FROM) diretamente na sua tabela de dados, mas sim em uma tabela auxiliar com um único campo Char. Depois vc vai ler esta tabela auxiliar e gravar cfe desejado na sua tabela definitiva. Ta bem claro na postagem do colega CLIPPER.
Existe uma forma de ler um arquivo texto sem usar uma tabela DBF auxiliar. Trata-se dos comandos FOPEN(),FSEEK(),FREAD(),FCLOSE().. etc.. do próprio clipper, porém é muito mais complicado ( ai sim é que é gostar de sofrer ehehe).
Um grande abraço.
Dércio Zanatta
-
leandrolinauer
- Usuário Nível 3

- Mensagens: 413
- Registrado em: 16 Out 2006 10:59
- Localização: Paranaíba-MS
Re: Importação de Arquivo TXT para DBF
Olá caro UKclipper.UKclipper escreveu:Olá, pessoal!
Tenho um arquivo TXT contendo os dados de batidas de ponto de funcionários já delimiitadas. Sei o tamanho de cada campo na linha e sei que cada linha corresponde a um registro.
Alguém tem idéia de como fazer para abrir e ler linha a linha do TXT até o final do arquivo para importar isso tudo para um arquivo DBF?
Como tenho mais perguntado do que dado sugestões neste fórum, prometo que, assim que meus sistemas de Gestão Empresarial e Depto. Pessoal estiverem prontos, eu os ponho aqui no fórum, tá?
Valeu!
Eu utilizo as funções do clipper de abertura de arquivos texto FOPEN()(),FSEEK(),FREAD(),FCLOSE(), faço remessas e retornos MATRIZ <-> FILIAL através de arquivos TXT, os quais leios e importo diretamente para dentro do DBF. Abaixo o exemplo de geração e importação de um arquivo.
//GERAÇÃO
Código: Selecionar todos
Static Procedure GRemessaZ
aFile:=wDirG+"Z"+aN_REM+"."+wExt //NOME DO ARQUIVO
DbSelectArea("CDES1000")
DbSeek(kA) //KA É A VARIAVEL ALTERAdo
Set Device To Print
Set Printer To &aFile.+wExt
@ PRow(),00 Say "I-CDES1000Z"+aN_REM+DtoC(Date())+Time()+StrZero(Val(wCod),4)+wEmpr+Repl(" ",117)+StrZero(PRow()+1,4)
While !Eof().And.P_REM==kA
ShowWaitProc(.T.)
If CDES1000->N_REM==aN_REM //se pertencer a remessa
@ PRow()+1,00 Say "M-CDES1000"+CONTA+N_DOC+DtoC(D_EMI)+StrZero(V_DES,18,2)+DtoC(D_VEN)+C_CX+DtoC(D_CX)+;
DtoC(D_PAGO)+StrZero(V_PAGO,18,2)+P_CONTA+OBS+N_REM+kG+kG+OPER+StrZero(PRow()+1,4)
EndIf
DbSkip(1)
End
@ PRow()+1,00 Say "F-CDES1000"+wVersao //fim do arquivo
Código: Selecionar todos
Static Procedure PRemessaZ
Private lProcessa:=.F.,xRemessa:=.F.
Declare aNFiles[ADir(wDirR+"Z*."+wExt)] //achei o arquivo 1 ou mais
ADir(wDirR+"Z*."+wExt,aNFiles) //classifico em ordem para fazer em ordem
ASort(aNFiles)
aFile:=FOpen(wDirR+aNFiles[1])
wComando:=FReadStr(aFile,10) //posiciono no primeiro comando
FSeek(aFile,10,0)
aNRet:=FreadStr(aFile,8) //nome da remessa
aNDia:=CtoD(FReadStr(aFile,10)) //dia
aNTim:=FreadStr(aFile,8) //hora
FSeek(aFile,36,0)
aNFil:=FreadStr(aFile,4) //numero filial
FSeek(aFile,203,0) //posiciono para o segundo comando
wComando:=FReadStr(aFile,10) //comando
xRemessa:=VPRetorno(@aNRet,wExt) //gravo a remessa que esta fazendo
If StrZero(Val(wCod),4)==aNFil.And.xRemessa=.T. //se for da loja certa
If wComando=="M-CDES1000" //se o comando é o inicio dos dados do arquivo
While .T.
ShowWaitProc() //barra de progressao
x_CONTA:=FReadStr(aFile,10) //leio e passo para variaveis
x_N_DOC:=FReadStr(aFile,10)
x_D_EMI:=CtoD(FReadStr(aFile,10))
//CtoD(FReadStr(aFile,2)+"/"+FReadStr(aFile,2)+"/"+FReadStr(aFile,4))
If !CDES1000->(DbSeek(x_CONTA+x_N_DOC+DtoS(x_D_EMI))) //procuro
CDES1000->(DbAppend()) //se não acho crio com dados principais
CDES1000->CONTA:=x_CONTA
CDES1000->N_DOC:=x_N_DOC
CDES1000->D_EMI:=x_D_EMI
CDES1000->(DbCommitAll())
EndIf
While CDES1000->(!RLock())
ShowMessage(,,{"Aguardando libera‡Æo do registro de despesa."},1)
End
//se achado ou não leio o arquivo e gravo direto dentro do campo dbf
CDES1000->V_DES :=Val(FReadStr(aFile,18))
CDES1000->D_VEN :=CtoD(FReadStr(aFile,10))
CDES1000->C_CX :=FReadStr(aFile,02)
CDES1000->D_CX :=CtoD(FReadStr(aFile,10))
CDES1000->D_PAGO :=CtoD(FReadStr(aFile,10))
CDES1000->V_PAGO :=Val(FReadStr(aFile,18))
CDES1000->P_CONTA:=FReadStr(aFile,10)
CDES1000->OBS :=FReadStr(aFile,60)
CDES1000->N_REM :=FReadStr(aFile,07)
CDES1000->O_PROC :=FReadStr(aFile,01)
CDES1000->P_REM :=FReadStr(aFile,01)
CDES1000->OPER :=FReadStr(aFile,10)
CDES1000->(DbCommitAll())
CDES1000->(DbUnLock())
FSeek(aFile,6,1) //posicionou //aqui //fim da primeira linha posiciono novamente
wComando:=FReadStr(aFile,10) // pego o comando
If wComando=="F-CDES1000" //verifico se for o fim ultima linha
lProcessa:=wProcessa:=.T. //saio
Exit
EndIf
End //senão volto ao while e continuo lendo porque é a proxima linha de dados
ElseIf wComando=="F-CDES1000" //se for fim
lProcessa:=wProcessa:=.T. //saio
EndIf
ElseIf StrZero(Val(wCod),4)#aNFil //se não é desta loja é de outra não processo para não dar lixo
ShowMessage(,,{"Arquivo retorno a processar ‚ da",""+wEmpr+"..."},0)
ElseIf xRemessa=.F.
lProcessa:=.F.
Else //se o aruqivo não andou no comando corretamente o arquivo esta com falha
ShowMessage(,,{"Arquivo a Ser Processado","NÆo Est Correto, Verifique!"},0)
EndIf
FClose(aFile) //fecho
If lProcessa=.T. //se processado corretamente elimino da lista o txt
ShowWait(,,"Processamento Conclu¡do Com Sucesso...")
GvRetorno(@aNRet,@aNDia,@aNTim) //gravo o retorno com sucesso
If File(wDirR+Left(aNFiles[1],8)+"."+pExt) //renomeio
FErase(wDirR+Left(aNFiles[1],8)+"."+Left(pExt,2)+"1") //se tiver outro iigual
FRename(wDirR+Left(aNFiles[1],8)+"."+pExt,wDirR+Left(aNFiles[1],8)+"."+Left(pExt,2)+"1")
EndIf
FRename(wDirR+Left(aNFiles[1],8)+"."+wExt,wDirR+Left(aNFiles[1],8)+"."+pExt) //renomeio
CloseWindow()
EndIf
Return lProcessa //fim do processo
//////////////////
Um abraço, espero ter ajudado na medida do possível.

