Função para ler arquivos maiores que 64k
Moderador: Moderadores
Função para ler arquivos maiores que 64k
Caros colegas clippeiros,
Alguém conhece alguma lib que leia arquivos texto acima de 64k?
Grato
Alguém conhece alguma lib que leia arquivos texto acima de 64k?
Grato
Re: Função para ler arquivos maiores que 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.asimoes escreveu:Alguém conhece alguma lib que leia arquivos texto acima de 64k?
[]'s
Maligno
http://www.buzinello.com/prg
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
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
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
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
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.filizola escreveu:eu utilizo a viewer.lib se quiser te mando.
passe o e-mail
meu email: asimoesluz@globo.com
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
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)
quitCó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
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
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


