Função para ler arquivos maiores que 64k

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Função para ler arquivos maiores que 64k

Mensagem por asimoes »

Caros colegas clippeiros,

Alguém conhece alguma lib que leia arquivos texto acima de 64k?

Grato
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Função para ler arquivos maiores que 64k

Mensagem 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
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem 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
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
filizola
Usuário Nível 3
Usuário Nível 3
Mensagens: 421
Registrado em: 19 Ago 2003 20:10
Localização: Belo Horizonte/MG

Mensagem por filizola »

eu utilizo a viewer.lib se quiser te mando.

passe o e-mail
"Um passo a frente, e já não estará mais no mesmo lugar..."
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Mensagem 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
Avatar do usuário
filizola
Usuário Nível 3
Usuário Nível 3
Mensagens: 421
Registrado em: 19 Ago 2003 20:10
Localização: Belo Horizonte/MG

Mensagem 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.
"Um passo a frente, e já não estará mais no mesmo lugar..."
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem 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
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem 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
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Mensagem por asimoes »

Eolo,

Valeu, me foi de grande ajuda.
Responder