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.