Ler TXT maior do que 64k

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Ler TXT maior do que 64k

Mensagem por rubens »

Olá pessoal...

Pesquisei bastante no fórum e não encontrei a solução desejada.

Estudei a função LerDanfe() e consegui fazer a leitura do xml conforme preciso. Ficou filé já está em produção aqui na loja.. lendo o XML e cadastrando/alterando os dados do meu sistema. Só que aconteceu o problema dos 64k. Veio um Xml com 93 itens e só consegui ler 63. Depois de quebrar a cabe
ça percebi que é o limite do memoread 64k. Daí pesquisei no fórum mas não achei a solução para o clipper...

Já fiz o seguinte:
Tentei appendar em um dbf, mas o limite do tamanho do campo é só 256 caracteres. Abri o xml pelo edit e ele apresenta um xml com 1022 colunas. daí não dá para appendar.

Para abrir com Fopen e lê com Fread ou Freadstr o limite também é 64k e eh preciso saber quantos bytes você quer, Como obter essa informção se não dá para ler o arquivo. daí também não consegui visualizar como fazer isso.

Agleum já conseguiu?
Tá pego nisso.

Obrigado.

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Ler TXT maior do que 64k

Mensagem por Pablo César »

Para abrir com Fopen e lê com Fread ou Freadstr o limite também é 64k e eh preciso saber quantos bytes você quer, Como obter essa informção se não dá para ler o arquivo. daí também não consegui visualizar como fazer isso.
Oi Rubens, essa informação sobre o FOPEN tem que ter menor que 64k, não procede o MemoRaed do Clipper: sim. Acho que está havendo alguma confusão. Mas é justamente a utilização das funções de baixo nivel que você não tem essa limitação. Com respeito ao tamanho do buffer para leitura de linha por linha, sugiro você dimensionar para o tamanho máximo que você pode encontrar.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Ler TXT maior do que 64k

Mensagem por Jairo Maia »

Olá Pablo,

O FOpen() abre o arquivo e retorna o file handle, independente do tamnho. Porém para ler os bytes usa-se o FRead(), e este é limitado a 64K.

Lembrando a sintaxe do FRead():

Código: Selecionar todos

FRead( nHandle, @cBuffer, nQtdBytes )
nHandle = o file handle retornado pelo FOpen()
@cBuffer = variavel que receberá os bytes lidos
nQtdBytes = quantidade de bytes a serem lidos, limitado a 64K (65.536 bytes)

A solução estará mesmo com FOpen() e FRead(), lendo uma quantidade de bytes superior ao tamnho máximo da linha, buscando o final de linha com AT(), e somando a uma variavel por exemplo: nPointer, e refazer a leitura posicionando o pointer na posição nPointer, e assim sucessivamente.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
sambomb
Usuário Nível 3
Usuário Nível 3
Mensagens: 250
Registrado em: 24 Out 2008 17:02
Localização: Itaocara - RJ - Brasil

Ler TXT maior do que 64k

Mensagem por sambomb »

Faça um executável a parte em 32 bits que faça essa leitura e gravação e faça a chamada pela sua aplicação gerando o retorno em um arquivo texto
Imagem

Rca Sistemas - Itaocara - RJ
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Ler TXT maior do que 64k

Mensagem por rubens »

Jairo...

Mas uma variável character não pode armanzenar somente 256bytes?
Criar uma aplicação em 32 bits é que é o problema....

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Ler TXT maior do que 64k

Mensagem por Pablo César »

O FOpen() abre o arquivo e retorna o file handle, independente do tamnho. Porém para ler os bytes usa-se o FRead(), e este é limitado a 64K.
Por isso mesmo, não precisa ler os 64k de entrada, pode ser lindo linha a linha. Não creio que tenha linha maior que 64k. Mas se for, pode ser composta em várias passagens, isto é, obter a linha concatenando-a até encontrar a quebra de linha, como você disse.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Ler TXT maior do que 64k

Mensagem por Jairo Maia »

Olá Rubens,
rubens escreveu:Mas uma variável character não pode armanzenar somente 256bytes?
Não. Uma variável caracter pode armazenar até 64k. O limite de 256 é para o tamanho do campo caracter no .DBF, sendo que o último caracter é reservado para final de linha, a rigor, sendo possível a gravação de no máximo 255 caracteres num campo do banco de dados tipo caracter. Num campo memo pode chegar ate 64k.

Se ajuda você ler linha-a-linha do seu arquivo arquivo, veja uma idéia com o exemplo abaixo:

Código: Selecionar todos

Local nEol, nLido, nPointer := 0
Local cEol := Chr( 13 ) + Chr( 10 )

Local cArquivo := "cArquivo.Ext"
Local nHandle := FOpen( cArquivo, 2 )

If FError() != 0
 Alert( "Nao foi possivel abrir: " + cArquivo )
 QUIT
EndIf

Do While ( .t. )

 cBuffer := Space( 1200 )       // vamos ler 1200 bytes de cada vez
 FSeek( nHandle, nPointer, 0 )  // posiciona o pointer para leitura

 nLido := FRead( nHandle , @cBuffer, 1200 )

 nEol := AT( cEol, cBuffer )
 If nEol <= 0  // fim de arquivo
  Exit
 Endi

 //If ( "<prod>" $ cBuffer )  // pode estabelecer aqui uma condicional

  cLinha := Left( cBuffer, nEol - 1 )

  If !Empty( cLinha )  // se linha não vazia,
   Alert( cLinha )     // tratamento da linha
  EndIf

 //EndIf
 
 nPointer += nEol + 1  // incrementa o pointer

EndDo

Return Nil
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
billy1943
Usuário Nível 4
Usuário Nível 4
Mensagens: 570
Registrado em: 12 Mai 2009 17:33
Localização: Bauru-SP

Ler TXT maior do que 64k

Mensagem por billy1943 »

Uma





Uma boa opção é usar a função FILEREAD da lib SUPER.
Essa LIB, por contar com os fontes de todas as suas funções, permite sua inclusão nos sistemas com a maior facilidade.
Eu a uso e muito, inclusive para ver em modo SPOOL, previamente, os relatórios gerados no sistema, sem me preocupar com o seu tamanho.
















youtube to mp3boa
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Ler TXT maior do que 64k

Mensagem por Clipper »

Prezado Colega

Você pode também usar as funções da Nanforum Lib.

FT_DFCLOSE() Close file displayed by FT_DISPFILE()
FT_DFSETUP() Set up parameters for FT_DISPFILE()
FT_DISPFILE() Browse a text file
FT_FAPPEND() Appends a line to the currently selected text file
FT_FBOF() Determine if attempt to skip past beginning of text file
FT_FDELETE() Deletes a line from the currently selected text file
FT_FEOF() Determine if end of text file has been encountered
FT_FERROR() Return the error code for a text file operation
FT_FGOBOT() Go to the last record in a text file
FT_FGOTO() Move record pointer to specific record in a text file
FT_FGOTOP() Go to the first record in a text file
FT_FINSERT() Inserts a line in the currently selected text file
FT_FLASTRE() Get the no. of records in the currently selected text file
FT_FREADLN() Read a line from the currently selected text file
FT_FRECNO() Return the current record number of a text file
FT_FSELECT() Select a text file workarea
FT_FSKIP() Move the record pointer to a new position in a text file
FT_FUSE() Open or close a text file for use by the FT_F* functions
FT_FWRITELN() Write a line to the currently selected text file


Até logo.

Marcelo
Programador que é programador, quando tá de folga vai inventar função nova, fazer testes, ou seja... se divertir
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
Responder