Insertar lineas de texto al inicio de un archivo del mismo tipo.

1,510 views
Skip to first unread message

Oscar Calderon Fuentes

unread,
Dec 23, 2010, 12:19:21 PM12/23/10
to publice...@googlegroups.com
Estimados,
 
Tengo un archivo de texto plano generado a partir de las filas de una tabla.
 
Este tiene la particularidad de que la línea de resumen (cantidad de filas del archivo, sumatoria de valores, etc) debe necesariamente ir a principio del archivo.
 
Actualmente salvé la situación preparando las líneas de detalle en un cursor, de esta manera genero la línea resumen que grabo primero, y luego recorro el cursor de principio a fin grabando las lineas de detalle provenientes del cursor señalado. Todo esto utilizando la funcion STRTOFILE().
 
El problema es que este proceso, a causa de que debo preparar un cursor intermedio, demora el doble de lo normal.
 
Lo ideal sería grabar  directamente las lineas detalle para posteriormente insertar la linea de resumen al principio del archivo. Probe con las funciones de low-level FOPEN(), FWRITE()  y FCLOSE(), pero me sobreescribió la primera línea en vez de insertar el texto resumen.
 
¿Alguien sabe algún truco para poder insertar al principio del archivo un texto sin sobreescribir el ya existente?
 
Atento a sus comentarios,


--
Oscar Calderon F.
 

Hugo C.

unread,
Dec 23, 2010, 3:01:22 PM12/23/10
to Comunidad de Visual Foxpro en Español
Intenta algo asi :

lcTexto = FILETOSTR("x.txt")
lcTexto = "PRIMERA LINEA" + CHR(10) + lcTexto
STRTOFILE(lcTexto,"x.txt")
> *Oscar Calderon F.*

Oscar Calderon Fuentes

unread,
Dec 23, 2010, 10:31:43 PM12/23/10
to publice...@googlegroups.com
Si, esta es una de las alternativas que probé pero depende de la memoria del equipo.
En este caso son cedentes bancarios, y el tamaño del archivo a leer con FILETOSTR() puede ser muy extenso en cantidad de filas.

--
Oscar Calderon F.
 

HernanCano

unread,
Dec 26, 2010, 3:00:23 PM12/26/10
to Comunidad de Visual Foxpro en Español

** Primera Alternativa **
**
** Generar X1.TXT sin el encabezado
** Generar X2.TXT con datos del encabezado
run copy X1.TXT + X2.TXT X.TXT /v
erase X1.TXT
erase X2.TXT
**

** Segunda Alternativa **
**
** Generar X1.DBF con los datos de los registros que irán en el TXT
final
** Obtener los datos del encabezado (recorriendo X1.DBF)
** StrToFile() para grabar los datos del encabezado en el X.TXT
** recorrer X1.DBF e ir grabando los datos de cada registro al X.TXT
**
**

Si la "Segunda Alternativa" se parece a tu "problema" ("es que en este
proceso debo preparar un cursor intermedio y demora el doble de lo
normal"), entonces nunca podrás obtener los valores del inicio.

Si la solución de "Hugo C" no te cuadra, seguramente tus archivos son
tan grandes que para que la RAM no te aguante, deben ser de
gigabytes......

Samuel SMH

unread,
Dec 27, 2010, 2:16:06 PM12/27/10
to Comunidad de Visual Foxpro en Español
Oscar; me parece o es que la solución tu mismo lo tienes en tus manos;
en tu consulta tu dices:
Probe con las funciones de low-level FOPEN(), FWRITE() y FCLOSE(),
pero me
sobreescribió la primera línea en vez de insertar el texto resumen.
Solución:
antes de empezar a llenar tu archivo de texto con STRTOFILE, inserta
la una fila en blanco, luego la reemplazas con el RESUMEN.

Oscar Calderon Fuentes

unread,
Dec 28, 2010, 11:19:22 AM12/28/10
to publice...@googlegroups.com
Estimados,
 
Gracias por los aportes, ya he solucionado el impase.
 
Pero ahora tengo otro asunto más heavy aún. A estos archivos generados, necesito modificarles su fecha de creación. Esto porque el banco valida esta fecha, y el cliente no desea quedar atado a subir los archivos al banco el mismo día de su creación. ¿me explico?
 
Si cliente genera los archivos hoy y los desea subir al día siguiente, no podrá hacerlo porque la fecha de creación del archivo es distinta a la fecha de procesamiento. Por lo tanto voy a tener que modificar la fecha de creación del archivo.
 
Se que se puede hacer mediante API, porque existen pequeñas aplicaciones de hacen este trabajo.
Entonces la idea es que la misma aplicación en VFP haga este cambio.
 
Estoy averiguando este tema de las API, pero si alguien ya ha hecho algo similar... me ahorraría tiempo.
 
 
Gracias,
--
Oscar Calderon F.
 

Reply all
Reply to author
Forward
0 new messages