Ler TXT maior do que 64k
Moderador: Moderadores
- rubens
- Colaborador

- Mensagens: 1520
- Registrado em: 16 Ago 2003 09:05
- Localização: Nova Xavantina - MT
Ler TXT maior do que 64k
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
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ê
"
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Ler TXT maior do que 64k
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.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.
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.
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.
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Ler TXT maior do que 64k
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.
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 )@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)
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

- Mensagens: 250
- Registrado em: 24 Out 2008 17:02
- Localização: Itaocara - RJ - Brasil
Ler TXT maior do que 64k
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

Rca Sistemas - Itaocara - RJ
- rubens
- Colaborador

- Mensagens: 1520
- Registrado em: 16 Ago 2003 09:05
- Localização: Nova Xavantina - MT
Ler TXT maior do que 64k
Jairo...
Mas uma variável character não pode armanzenar somente 256bytes?
Criar uma aplicação em 32 bits é que é o problema....
Rubens
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ê
"
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Ler TXT maior do que 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.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.
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.
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.
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Ler TXT maior do que 64k
Olá Rubens,
Se ajuda você ler linha-a-linha do seu arquivo arquivo, veja uma idéia com o exemplo abaixo:
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.rubens escreveu:Mas uma variável character não pode armanzenar somente 256bytes?
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 NilAbraç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)
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)
Ler TXT maior do que 64k
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
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.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Ler TXT maior do que 64k
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
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)
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)
