PROBLEMAS AL LEER ARCHIVO TEXTO.

1,830 views
Skip to first unread message

Roberto Matarrita

unread,
Oct 17, 2011, 6:26:51 PM10/17/11
to publice...@googlegroups.com
Buenas tardes amigos.

Tengo un archivo de texto el cual contiene 286 posiciones.
Debo leer linea a lines y luego ir haciendo substracciones.
Aparentemente y no se si me equivoco, pero solo me está leyendo 256
caracteres y no lee el resto de la tira de caracteres.

Necesito saber si esto es posible, o bien como puedo hacer para leer
todo el archivo texto.
Por lo largo del archivo no puedo hacerle un append from ya que la
longitud del registro es de 286 caracteres.

Me urge me ayuden, ya he utilizado el fopen, fgets
Utilicè el fread pero desconozco si lee linea a lines.

Gracias

Roberto
Costa Rica.

Daniel Sánchez

unread,
Oct 17, 2011, 6:46:03 PM10/17/11
to publice...@googlegroups.com
Si usas el filetostr te lee todo el archivo y lo pone en una variable de memoria, desde ahí podrías leerlo sin problemas. me parece.

Saludos

--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software & Sistemas
Móvil +051-949398047
Trujillo - Perú

Luis Maria Guayan

unread,
Oct 17, 2011, 7:32:58 PM10/17/11
to publice...@googlegroups.com
No indicas como lees el archivo, pero con FILETOSTR() lo deberias leer a todo sin problemas.

Si cada línea termina con un retorno de carro y/o salto de línea, lo puedes poner en un Array con ALINES()

Si quieres poner 286 caracteres en un campo del tipo Caracter, no podrás, ya que el límite es 255 caracteres, para ello deberas utilizar un campo tipo Memo.

Muestranos tu código

Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

Roberto Matarrita

unread,
Oct 18, 2011, 12:46:25 PM10/18/11
to publice...@googlegroups.com
Gracias amigos por sus amabilidades.
Logre resolver el problema con el ejemplo de la ayuda de VFP en cuanto
a la instrucción.
Fgests
Este es el ejemplo.


STORE FOPEN('test.txt') TO gnFileHandle && Open the file

STORE FSEEK(gnFileHandle, 0, 2) TO gnEnd && Move pointer to EOF

STORE FSEEK(gnFileHandle, 0) TO gnTop && Move pointer to BOF

IF gnEnd <= 0 && Is file empty?

WAIT WINDOW 'This file is empty!' NOWAIT

ELSE && If not

gcString = FGETS(gnFileHandle, gnEnd) && Store contents

? gcString

ENDIF

= FCLOSE(gnFileHandle) && Close the file

Lo que no me queda muy claro es este comentario en relación a los 8192 bytes.


Specifies the number of bytes FGETS( ) returns. FGETS( ) returns
nBytes bytes unless a carriage return is encountered first. FGETS( )
returns data between the starting file-pointer position and the
carriage return if a carriage return is encountered within nBytes
bytes.

FGETS( ) returns a maximum of 8192 bytes. If you omit nBytes, FGETS(
)returns 254 bytes by default.

Gracias LUis Maria, el archivo lo voy leyendo linea a linea.


Roberto
Costa Rica.
El día 18 de octubre de 2011 01:32, Luis Maria Guayan
<luism...@gmail.com> escribió:

Walter R. Ojeda Valiente

unread,
Oct 18, 2011, 2:27:14 PM10/18/11
to publice...@googlegroups.com
Puedes decirle a la función FGETS() cuantos bytes deseas leer. La función FGETS() termina cuando:
a) encuentra un retorno de carro/salto de línea, o
b) leyó la cantidad de caracteres especificados.

La cantidad de caracteres especificados es por defecto 254 pero tú puedes escribir cualquier otra cantidad que esté entre 1 (mínimo) y 8192 (máximo).

Saludos.

Walter.



> Date: Tue, 18 Oct 2011 18:46:25 +0200
> Subject: Re: [vfp] PROBLEMAS AL LEER ARCHIVO TEXTO.
> From: rmat...@gmail.com
> To: publice...@googlegroups.com

Roberto Matarrita

unread,
Oct 19, 2011, 7:16:59 PM10/19/11
to publice...@googlegroups.com
Asi lo hice Walter y me funcionó. Pero dime que pasaría si el archivo
llegara ha ser bastante grande y sobrepasa esta cantidad.

Gracias.

Roberto
Costa Rica.

El día 18 de octubre de 2011 20:27, Walter R. Ojeda Valiente
<wr...@hotmail.com> escribió:

Walter R. Ojeda Valiente

unread,
Oct 21, 2011, 6:16:50 PM10/21/11
to publice...@googlegroups.com
Roberto, el límite de 8192 caracteres es POR LÍNEA, no es el tamaño del archivo.

Sería extremadamente raro que encontraras un archivo cuyas líneas tengan más de 8192 caracteres. Y en ese caso, tendrías que usar más de una vez la función FGETS() para obtener las líneas que pasan el límite.

Saludos.

Walter.



> Date: Thu, 20 Oct 2011 01:16:59 +0200

Roberto Matarrita

unread,
Oct 22, 2011, 9:01:06 PM10/22/11
to publice...@googlegroups.com
Entendido Walter muchas gracias.

OK

El día 21 de octubre de 2011 16:16, Walter R. Ojeda Valiente

Manuel Marin Montalvan

unread,
Jan 27, 2015, 8:40:09 PM1/27/15
to publice...@googlegroups.com, wr...@hotmail.com
> >Hola, si alguie podría por favor ayudarme un extraño suceso que me sucede en un archivo. Despues de abrir un archivo TXT, procedo a leer cada line, este es la parte que me parece muy extraño, tal vez ustedes podrían ayudarme a resolverlo.
 
           Txtfile = GETFILE('TXT', 'Abrir TXT:','Abrir', 1, 'Abrir Archivo TXT de Carga')
Txtfile = FOPEN(Txtfile)         && Abrir el archivo
gnEnd   = FSEEK(Txtfile, 0, 2)   && Mover puntero a EOF
gnTop   = FSEEK(Txtfile, 0, 0)   && Mover puntero a BOF
IF gnEnd <= 0  && Está vacío el archivo?
    WAIT WINDOW 'Este archivo está vacío!' NOWAIT
ENDIF
=SQLEXEC(nconex,"select *from carga where fproceso='XXXXXXXX'","Fcarga")
Totcar      = 0
TotCampos   = FCOUNT("Fcarga")
FOR gnCount = 1 TO TotCampos    &&&FCOUNT("Fcarga")
    Tcampo  = FIELD(gnCount)  && Muestra cada campo
    Totcar  = Totcar+LEN(&Tcampo)
ENDFOR
DO WHILE !FEOF(Txtfile)
    Xver = fgets(Txtfile,Totcar)
    IF LEN(Xver) = Totcar
        filetmp = FCREATE('temporal.txt')
        = FWRITE(filetmp, Xver)
        = FCLOSE(filetmp)
        file2  = FOPEN('temporal.txt')         && Abrir el archivo
        gnEnd2 = FSEEK(file2, 0, 2)   && Mover puntero a EOF
        gnTop2 = FSEEK(file2, 0, 0)   && Mover puntero a BOF
        DO WHILE !FEOF(file2)
            fproceso   = ALLTRIM(FREAD(file2,9))
            agencia    = FREAD(file2,50)
            gestor     = FREAD(file2,100)
            territorio = FREAD(file2,40)
            oficina    = FREAD(file2,4)
            subpro     = FREAD(file2,4)
            nom_subpro = fgets(file2,50)
hasta ahí todo parece normal, pero cuando quiero tomar el contenido de una de las variables, resulta que esta vacía, sin embargo, cuando ejecuto displa memory, la variable tiene datos, no logro conprender que es lo que me falta o estoy haciendo mal, por favor me pueden ayudar?

Fidel Charny

unread,
Jan 28, 2015, 7:24:06 AM1/28/15
to publice...@googlegroups.com, wr...@hotmail.com
No sé que necesitas hacer, pero te digo algunas cosas para ir emprolijando
1) GetFile() puede devolver un valor vacío. Necesitas controlar Empty(txtFile)
   (recomiendo: no uses esa nomenclatura porque ese prefijo corresponde a los Textbox. Mejor sería, por ejemplo, "lcFileText"
2) Fopen() y Fcreate() devuelven un valor numérico: -1 si falla y positivo si no falla. Por lo tanto, la nomenclatura sería, por ejemplo:
lnHand = FOPEN(Txtfile)
3) Debes testear primero si el valor devuelto por Fopen() = -1 (falló la apertura)
4) No sé cuál es la idea de TotCar (que debería llamarse "lnTotCar"), pero me parece mejor usar aFields(). Si no tienes que estar seguro que todos los campos son character.
lnTotCar=0
lnFields=afields(laFields,"fcarga")
for i=1 to lnFields
        lnTotCar = lnTotcar + laFields[i,3]
endfor

5) Fgets(lnHand , lnBytes ) && lee lnBytes de una línea o hasta EOL()   Máximo valor para nBytes = 8192

6) En el ejemplo que pones, estás mezclando fread() con fgets() lo que te dará un resultado erróneo. Pero mira el punto siguiente.

7) Puedes evitar totalmente el segundo archivo de texto, componiendo la cadena. Ejemplo
* lcGet=fgets(lnHand, 2048) && acá lo reemplazo armando una supuesta línea de 256 chars.

lcGet
="20141225"
lcget
=lcGet+Padr("GRAN AGENCIA DE COLOCACIONES ",50," ")
lcGet
=lcget+Padr("GRAN GESTOR DE COLOCACIONES ",100)
lcGet
=lcget+Padr("TERRITORIO DE COLOCACIONES",40)
lcGet
=lcGEt+Padr("OFI1",4)
lcGet
=lcGet+Padr("SP1",4)
lcGet
=lcget+PADR("SUB_PRODUCTO DE COLOCACIONES",50)

* Valorizo las variables a partir de la cadena
fProceso
= Substr(lcGet,1,8)
agencia
= substr(lcGet,9,50)
gestor
= substr(lcGet,59,100)
territorio
= substr(lcGet,159,40)
oficina
= substr(lcGet ,199,4)
subpro
= substr(lcGEt , 203 , 4)
nom_SubPro
= substr(lcGet,207,50)

lcResult
="Len(lcGet)="+TRANSFORM(LEN(lcGet)) ;
   
+CHR(13) + "fProceso="+fProceso ;
   
+chr(13) + "agencia="+agencia ;
   
+chr(13) + "gestor="+gestor ;
   
+chr(13) + "territorio="+territorio ;
   
+chr(13) + "oficina="+oficina ;
   
+chr(13) + "subpro="+subpro ;
   
+chr(13) + "nom_SubPro="+nom_SubPro
   

Messagebox(lcResult)
...

Ricardo Pina

unread,
Jan 28, 2015, 8:33:46 AM1/28/15
to Grupo VFP
O me parece a mi o le dió enviar a un hilo de 2011 ?

--
            

                   Ricardo Pina

Desarrollo y Servicios Informáticos

                  Profesionales
               www.dsip.com.ar

 

 

Manuel Marin Montalvan

unread,
Jan 28, 2015, 9:59:09 AM1/28/15
to publice...@googlegroups.com
Muchas gracias Fidel, al anlizar tu estructura, me di cuenta de donde estaba mi error. y paso a explicarlo:
- Como no sé que cantidad de caracteres debo leer, entonces debo saber cuanto son, para eso es esta linea

=SQLEXEC(nconex,"select *from carga where fproceso='XXXXXXXX'","Fcarga")
Totcar      = 0
TotCampos   = FCOUNT("Fcarga")
FOR gnCount = 1 TO TotCampos    &&&FCOUNT("Fcarga")
    Tcampo  = FIELD(gnCount)  && Muestra cada campo
    Totcar  = Totcar+LEN(&Tcampo)
ENDFOR
Donde "Totcar", almacenará la totalidad de caracteres o bytes que debo leer por cada linea en el archivo TXT
y "TotCampos" es la variable que almacenará el total de campos de"FCOUNT("Fcarga")"
y el buce FOR-ENDFOR, Contiene la secuencia de obtener la suma de caracteres por cada campo, de esa manera sabré cuantos caracteres debo leer por cada fila en el archivo TXT.
y en la siguiente secuencia DO WHILE, empiezo a leer el archivo TXT, sabiendo cuantos bytes o caracteres debo leerlo por linea.
y lo almaceno en la variable "Xver", pero el problema surge cuando el archivo TXT no tiene delimitadores, es decir viene todo junto, pero tiene espacios definidos, razón por la cual se hizo el proceso anterior.
Luego al leer la fila con los caracteres definidos es decir la fila de lectura debe ser de 1321 caracteres y así sucesivamente,lo almacenamos en la variabe "Xver" linea por linea. Entonces, cómo puedo leer caracteres correspondientes a cada campo de la variable "Xver" por ejemplo: la linea tiene esto "26-Oct-10CASTILLEJO NORTE                                  RENZO DENEGRI                                                                                       NORTE  "etc
lo que se me ocurrio es grabarlo en un rchivo TXT temporal para volver a leerlo con FREAD(), que me permite leerlo caracter a caracter y almacenarlo en las variables correspondientes y luego guardarlos en los campos de la tabla.
El problema erá que las variables estaban en blanco. despues de leer tú estructura detecte que las variables eran igual a los campos de la tabla abierta y por eso no podian almacenarlas. Entonces tube que cerrar la tabla y volver a abrirla al final y no generar ambiguedad, para poder guardarlas.

DO WHILE !FEOF(Txtfile)
    Xver = fgets(Txtfile,Totcar)
    IF LEN(Xver) = Totcar
        filetmp = FCREATE('temporal.txt')
        = FWRITE(filetmp, Xver)
        = FCLOSE(filetmp)
        file2  = FOPEN('temporal.txt')         && Abrir el archivo
        gnEnd2 = FSEEK(file2, 0, 2)   && Mover puntero a EOF
        gnTop2 = FSEEK(file2, 0, 0)   && Mover puntero a BOF
        DO WHILE !FEOF(file2)
            fproceso   = ALLTRIM(FREAD(file2,9))
            agencia    = FREAD(file2,50)
            gestor     = FREAD(file2,100)
            territorio = FREAD(file2,40)
            oficina    = FREAD(file2,4)
            subpro     = FREAD(file2,4)
            nom_subpro = fgets(file2,50)

Muchas gracias por ayudarme en detectar la falla de mi secuencia.
Reply all
Reply to author
Forward
0 new messages