Página 1 de 1
Função para ler arquivos maiores que 64k
Enviado: 26 Abr 2007 18:29
por asimoes
Caros colegas clippeiros,
Alguém conhece alguma lib que leia arquivos texto acima de 64k?
Grato
Re: Função para ler arquivos maiores que 64k
Enviado: 26 Abr 2007 18:45
por Maligno
asimoes escreveu:Alguém conhece alguma lib que leia arquivos texto acima de 64k?
Visite o site
The Oasis, provavelmente o maior repositório de código Clipper em toda a Net. Vi uma LIB dessas por lá. Inclusive, um amigo meu usou há um tempo e disse que gostou muito.
[]'s
Maligno
http://www.buzinello.com/prg
Enviado: 26 Abr 2007 19:02
por sygecom
Tche.....de uma olhada nesse link abaixo:
https://pctoledo.org/forum/viewtopic.php?t=3954
Com essa função ai vc consegue visualizar arquivo texto muito mais alem dos 64k......ele vai muito longe !!
Abraços
Enviado: 27 Abr 2007 18:49
por filizola
eu utilizo a viewer.lib se quiser te mando.
passe o e-mail
Enviado: 27 Abr 2007 21:32
por asimoes
filizola escreveu:eu utilizo a viewer.lib se quiser te mando.
passe o e-mail
Filizola, na verdade eu preciso ler um arquivo e gravar em um campo de um dbf (char de 100). São arquivos grandes, eu tentei fazer append from, não funcionou, tentei pelo memoread e também não funcionou.
meu email:
asimoesluz@globo.com
Enviado: 28 Abr 2007 08:37
por filizola
bem, então o que vc precisa é de utilizar as funções de baixo nível.
fopen()
fread()
fclose()
dê uma olhada no NG é super simples.
Enviado: 28 Abr 2007 09:59
por Eolo
Asimoes,
Use as funções de baixo nível FOPEN(), FREAD(), FSEEK() etc. O arquivo de origem pode ser de
qualquer tipo e ter
qualquer tamanho. No exemplo a seguir, cada linha do arquivo ORIGEM.abc (digamos com 3Gb...) tem tamanho 100 e contém 3 informações, com tamanhos 10, 70 e 18, mais a quebra de linha - chr(10) e chr(13). A função lê o ORIGEM de 100 em 100 e vai APPENdando o DBF destino. Agora é adaptar às suas necessidades.
Eolo
Código: Selecionar todos
arquivo="c:\pasta\pasta\origem.abc"
tam_reg=100
learq(arquivo,tam_reg)
quit
Código: Selecionar todos
function learq(nome_arq,linha)
priv num_arq, tam_arq
num_arq=fopen(nome_arq)
if !num_arq>0
?"Erro de abertura"
quit
endi
use destino excl new
tam_arq=fseek(num_arq,0,2)
fseek(num_arq,0)
priv leitura:=space(linha), c, contador
for contador=1 to tam_arq step linha
c=fread(num_arq,@leitura,linha)
if c#linha
? "Erro de leitura"
quit
endi
appe blan
repl destino->campo1 with val(substr(leitura,1,10))
repl destino->campo2 with substr(leitura,11,70)
repl destino->campo3 with substr(leitura,81,18)
dbcommit()
next
fclose(num_arq)
use
retu
Enviado: 28 Abr 2007 15:50
por Eolo
Asimoes,
No caminho contrário (
criar um TXT a partir do DBF, vc pode usar o FCREATE() em conjunto com o FWRITE(). O cuidado a tomar é que, se o arquivo TXT já existir, o FCREATE() zera ele quando abrir, sem avisar. Se vc quer complementar e não zerar o TXT, use o FOPEN(). Exemplo a seguir.
Nota: no post anterior, usei a leitura do TXT de 100 em 100B, o que dá muitos acessos a disco. Pra melhorar, é só ler digamos de 60 em 60KB e depois separar cada 100B na memória. Mesma coisa para o caminho inverso (de gravação do TXT).
Eolo
Código: Selecionar todos
priv arquivo:="c:\pasta\pasta\clientes.txt"
priv num_arq
if file(arquivo)
* arquivo já existe
num_arq=FOPEN(arquivo)
if !num_arq>0
?"Erro de abertura"
quit
endi
FSEEK(num_arq,0,2)
* posiciona ponteiro no fim do arquivo
* para adicionar novas linhas
else
* arquivo TXT não existe
num_arq:=FCREATE(arquivo)
if !num_arq>0
?"Erro de criação"
quit
endi
endi
priv linha, grava
use clientes excl new
go top
do whil !eof()
linha=strzero(clientes->codigo,5,0)+clientes->nome+chr(10)+chr(13)
grava=FWRITE(num_arq,linha)
if grava#len(linha)
?"Erro de gravação"
quit
endi
skip
endd
fclose(num_arq)
use
Enviado: 01 Mai 2007 21:53
por asimoes
Eolo,
Valeu, me foi de grande ajuda.