Página 1 de 1
Ler TXT maior do que 64k
Enviado: 17 Dez 2012 10:52
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
Ler TXT maior do que 64k
Enviado: 17 Dez 2012 12:22
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.
Ler TXT maior do que 64k
Enviado: 17 Dez 2012 13:20
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():
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.
Ler TXT maior do que 64k
Enviado: 17 Dez 2012 14:28
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
Ler TXT maior do que 64k
Enviado: 17 Dez 2012 15:12
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
Ler TXT maior do que 64k
Enviado: 17 Dez 2012 15:38
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.
Ler TXT maior do que 64k
Enviado: 17 Dez 2012 15:44
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
Ler TXT maior do que 64k
Enviado: 10 Fev 2013 14:25
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
Ler TXT maior do que 64k
Enviado: 11 Fev 2013 21:59
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