Página 1 de 1

Txt para dbf

Enviado: 05 Fev 2005 12:53
por JuniorVaz
Preciso de uma ajudinha pra fazer importação de um arquivo txt para DBF, estou usando o seguinte comando...

use ac
append from ac.txt delimited with ";"
dbcloseall()
return

Neste dbf existem apenas 2 campos, que são NOME e SOBRENOME, que são dois campos caracteres, e com tamanho=20.

A estrutura do meu txt está assim:


Jorge Luiz;Vaz
Barbara;Eufrasio
Caroline Michele;Vaz
Humberto;Silva
João;Ramos

dai fiz um prg de teste, apenas com os comandos que citei assima, ele repassa as informações pro dbf, mas ele não está fazendo a divisão, de NOME e SOBRENOME, está fikando tudo no campo NOME, por exemplo

NOME ____________________SOBRENOME
Jorge Luiz;vaz

Não sei se ta faltando alguma instrução no codigo acima, ou se tenho que fazer alguma indicação no começo do txt, preciso de uma ajudinha ae... vlw

Ler arquivo texto

Enviado: 06 Fev 2005 15:22
por Domenico
Preazdo Junior,

Você precisará utilizar as seguintes funções:

Este comando atribui o arquivo a uma variavel
Atenção: Não pode ter mais de 64 Kb
cString:= memoread(arquivo.txt)

Este comando retorna o número de linhas da variável que agora contem o arquivo texto.
Pode ser usado por exemplo da seguinte forma
for y = 1 to nlinhas
nlinhas: Mlcount(cstring)

Este comando le a linha do arquivo texto
cLnha=memoline(cstring, , y)

Este comando retorna a posição do ; na linha corrente
nPosicao:= At(;, cLnha)

cNome:= substr(cLinha, 1, (nPosicao - 1) )
cSobrenome:= substr(clinha, (nPosicao + 1) )

Neste ponto você terá Nome e Sobrenome prontos para serem gravados no DBF.

Obs.: por segurança utilize a função allTrim() para retirar provaveis espaçoes em branco, principalmente no sobrenome.

Por favor se alguem souber uma forma mais simplificada, informe.

Enviado: 06 Fev 2005 17:27
por Mário Isa
Você também pode simplesmente........

append from meutxt.txt sdf

Abraços
Mário

Certo

Enviado: 06 Fev 2005 17:28
por JuniorVaz
Eu tentei o que vc citou, mas não obtive resultado, não funcionou muito bem, deu alguns erro, e não sei se os resolvi certo, sera que dava pra voce montar o codigo como fikaria, junto com o que eu citei no primeiro post, pra ver se funciona... Este que eu montei fikou assim:

use ac
ac="ac.txt"
cString:= memoread(ac)
stor 0 to nlinhas
for y = 1 to nlinhas
nlinhas: Mlcount(cstring)
cLnha=memoline(cstring, , y)
nPosicao:= At(,cLnha)
cNome:= substr(cLinha, 1, (nPosicao - 1) )
cSobrenome:= substr(clinha, (nPosicao + 1) )
append from ac.txt delimited with ";"
dbcloseall()
next
return

Este é o codigo inteiro de como fiz, pois fiz este exemplo apenas para aprender, antes de implantalo no meu sistema... VLW

Txt para DBF

Enviado: 06 Fev 2005 19:24
por Domenico
Prezado Junior,

Olha o que vc fez

___________________________________
use ac
ac="ac.txt"
cString:= memoread(ac)
stor 0 to nlinhas // Esta linha é inútil
for y = 1 to nlinhas // Esta linha está antes de determinar o valor da variavel
nlinhas: Mlcount(cstring)
cLnha=memoline(cstring, , y)
nPosicao:= At(,cLnha) // Você não especificou qual string localizar em cLinha
cNome:= substr(cLinha, 1, (nPosicao - 1) ) // Procurar em cLinha a partir da posicão 1 até uma posição antes do ";"
cSobrenome:= substr(clinha, (nPosicao + 1) ) // Procurar em cLinha a partir da posição seguinte a nPosicao
append from ac.txt delimited with ";"
dbcloseall()
next
return
____________________________

Pelo jeito o arquivo chama-se ac.txt e o dbf chama-se ac.dbf

Então:

use ac // Abre o dbf
cArquivo:= memoread("ac.txt") // Le o arquivo texto
nLinhas:= MlCount(cArquivo) // conta o numero de linhas
for y = 1 to nLinhas // Loop do 1 até última linha
cLinha:= MemoLine(cArquivo, , y) // Lê a linha especificada
nPosicao:= At(";" , cLinha) // Acha a posição do delimitador ;
cNome:= substr(cLinha,1,(nPosicao - 1) ) // Extrai o nome até a posição do separador ";"
cSobrenome:= substr(cLinha, (nPosicao + 1) ) // Extrai o sobrenome um digito após a posicao do separador ";"
append blank
replace cNome with nome // supondo que o campo nome se chame NOME
replace cSobrenome with sobrenome // supondo que o campo sobrenome se chame SOBRENOME
next

close // aqui vc fecha o banco de dados se quiser, não sei como é sua programação.

Teoricamente este código deve funcionar, se não funcionar avisa

Este código serve de modelo para qualquer transferencia de texto para bancos de dados.

Manaual do clipper
APPEND FROM

Utilização: Para incluir registros em um arquivo DBF através de sua leitura a partir de outro arquivo de banco de dados (DBF), de um arquivo delimitados por virgulas ou de um arquivo de formato de dados de sistema (SDF) System Data Format
Se não for feita nenhuma especificação o Clipper supõe que o arquivo de origem seja um DBF.

TXT para DBF

Enviado: 06 Fev 2005 19:36
por Domenico
Desculpe

no comando replace inverti varialvel com nome de campo

fica:

replace NOME with cNome
replace SOBRENOME with cSobrenome

Aé logo

TXT para DBF

Enviado: 06 Fev 2005 20:15
por Domenico
Prezado Junior,

Reescrevi o código a limpo para que não existam dúvidas.
Pode copiar exatamente como está e rodar.

use ac
cArquivo:= memoread("ac.txt")
nLinhas:= MlCount(cArquivo)
for y = 1 to nLinhas
cLinha:= MemoLine(cArquivo, , y)
nPosicao:= At(";" , cLinha)
cNome:= substr(cLinha,1,(nPosicao - 1) )
cSobrenome:= substr(cLinha, (nPosicao + 1) )
append blank
replace Nome with cNome
replace Sobrenome with cSobrenome
next

dbcloseall()

return

Funcionou

Enviado: 07 Fev 2005 12:44
por JuniorVaz
Obrigado ae Domenico, Funcionou bem certinho... :)

Enviado: 07 Fev 2005 12:47
por Jorge Adourian
JuniorVaz escreveu:A estrutura do meu txt está assim:

Jorge Luiz;Vaz
Barbara;Eufrasio
Caroline Michele;Vaz
Humberto;Silva
João;Ramos
Mário Isa escreveu:Você também pode simplesmente........

append from meutxt.txt sdf
Caro Mário, sua solução é totalmente sem sentido, afinal se SDF significa sem delimitador, é óbvio que não servirá para um arquivo onde o ; está presente.

Enviado: 08 Fev 2005 23:27
por Mário Isa
Aí pessoal!
Mil perdões hein !?
Eu achava que o .txt do colega era de colunas delimitadas como se fosse assim:

lista.txt
00001 ANDRE DOS SANTOS RUA JACARANDA, 343
00002 HELOISA HELENA SILVA RUA MATINAL, 555
00003 MARIO ANTONIO PEREIRA PASSEIO SAO LUIZ, 209

Se assim fosse e você tivesse um .dbf com a seguinte estrutura.
Nome do dbf: Cadastro.dbf
CODIGO Caracter 5
NOME Caracter 21
ENDERECO Caracter 40

Aí sim você poderia fazer
use cadastro
append from lista.txt sdf

Com a cláusula sdf todos os dados do .txt seriam transportados para os campos do .dbf desde que os mesmos estivessem na sequência.

Uma outra coissa interessante que você pode fazer:
Digamos que eu tenha o seguinte .dbf
LIXO.DBF
LINHA Caracter 200

E eu faça:
use lixo
append from lista.txt sdf

Assim cada registro do lixo.dbf contém a linha do .txt
E eu posso "cortar" os dados no substring(linha,1,5) é igual ao código,
estou certo?

Obrigado.
Mário