• Publicidad

Modo Lectura/Escritura de archivos (E/S)

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Modo Lectura/Escritura de archivos (E/S)

Notapor jc.morataya » 2008-02-28 09:43 @447

Hola,

Tengo un script que lee dos archivos con el mismo formato pero con diferente cantidad de datos, los compara y guarda los elementos diferentes.

Lo que necesito es que esos elementos deben ser agregados en el archivo que no los tiene para "actualizarlo" y volver ambos archivos iguales.

Abro los dos archivos uno en modo lectura y otro en modo lectura/escritura así:

Código: Seleccionar todo
open(FLE1,">>FILE1.TXT) (Lectura/Escritura)
open(FLE2,">FILE.TXT") (Lectura)


Pero...

Cuando se escriben los datos en FLE1 van al final del archivo no en cada uno de los lugares donde deberían ir. Es decir:

FLE1 tiene esta forma
Código: Seleccionar todo
11111111111111111111111111111111111111111111111
22222222222222222222222222222222222222222222222
33333333333333333333333333333333333333333333333


y FLE2
Código: Seleccionar todo
11111111111111111111111111111111111111111111111
22222222222222222222222222222222222222222222222
44444444444444444444444444444444444444444444444
33333333333333333333333333333333333333333333333


... Pero luego de la escritura en FLE1, el resultado es:

Código: Seleccionar todo
11111111111111111111111111111111111111111111111
22222222222222222222222222222222222222222222222
33333333333333333333333333333333333333333333333
44444444444444444444444444444444444444444444444


Mientras que debería ser idéntico FLE2...

¿Que me recomiendan?

Gracias por adelantado,

JC
jc.morataya
Perlero nuevo
Perlero nuevo
 
Mensajes: 33
Registrado: 2008-02-28 09:30 @438

Publicidad

Notapor explorer » 2008-02-28 10:57 @498

Bienvenido a los foros de Perl en Español, jc.morataya.

Según veo en los open, no estás abriendo el FLE2 en modo lectura, sino en modo escritura.

La solución al problema puede ser obvia...

Si los dos ficheros deben acabar siendo el mismo, basta con copiar uno en el otro. ¿No?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor jc.morataya » 2008-02-28 12:34 @565

Hola,

Gracias por la respuesta,

Te aclaro algunas cosas:

Estoy abriendo el FLE2 así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open(FLE2,$ARGV[0]) || die "no puede abrirse $ARGV[0]: $!\n";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Y no me vale copiar uno sobre el otro porque no todas las cosas del FLE2 deben ir en el FLE1.

¿Qué crees que pase?

Saludos,
jc.morataya
Perlero nuevo
Perlero nuevo
 
Mensajes: 33
Registrado: 2008-02-28 09:30 @438

Notapor explorer » 2008-02-28 13:03 @585

Vale, entonces los dos ficheros no acaban exactamente igual, sino que FLE1 incorpora lo nuevo que traiga FLE2.

Lo que puede estar pasando es que cuando haces una lectura (la del registro 3 en FLE1) queda el cursor al final del fichero. Como el registro leído (3..) es distinto de el del segundo fichero (4..), das la orden de escribir en ese fichero, pero lo haces en donde quedó el cursor (al final), por lo que aparece el registro 4 (el nuevo) después del 3 (el leído).

La solución debería ser recordar la posición del cursor al principio de los registros, por si tienen que ser sobreescritos por las diferencias encontradas.

Hay otras formas de hacerlo, como por ejemplo, almacenar el contenido de los ficheros en memoria y escribir el resultado en los ficheros junto con las diferencias. Esto depende, naturalmente, del tamaño de los ficheros.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor jc.morataya » 2008-02-28 13:26 @601

Hola,
OK, creo que es lo que necesito.

Pero...
¿Cómo le digo a Perl cuál es la posición del puntero?

¡Gracias!

JC
jc.morataya
Perlero nuevo
Perlero nuevo
 
Mensajes: 33
Registrado: 2008-02-28 09:30 @438

Notapor explorer » 2008-02-28 13:34 @607

La función tell() te dice la posición, y con la función seek() lo cambias.

Recuerda que esto te servirá solo si los registros de los dos ficheros tienen el mismo tamaño.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor jc.morataya » 2008-02-28 18:27 @810

Hola.

Lo he conseguido, ahora puedo posicionarme en el lugar que necesito usando tell() y seek()... ahora el problema es que todo lo que mando a imprimir al archivo abierto en modo lectura/escritura se sobreescribe encima del texto del archivo...

¿Cómo hago para evitarlo? Es decir, ¡lo que se mande a imprimir que desplace hacia abajo a lo que ya está escrito "haciendo espacio" para adherirlo!

¡Gracias!

Un saludo.

JC
jc.morataya
Perlero nuevo
Perlero nuevo
 
Mensajes: 33
Registrado: 2008-02-28 09:30 @438

Notapor explorer » 2008-02-28 18:46 @824

Pues lo siento, pero eso no se puede hacer "en tiempo real", con los ficheros, usando tell() y seek().

Quizás la solución más sencilla sea: o leer todo el fichero en memoria y grabando el resultado al final, o usar el módulo Tie::File. Según la documentación, para insertar registros tienes que usar splice().
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron