• Publicidad

¿Cómo modificar un archivo sín crear uno nuevo?

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

¿Cómo modificar un archivo sín crear uno nuevo?

Notapor creating021 » 2007-01-10 13:11 @591

Supóngase que se tiene un archivo muy grande y hay que modificar X línea, ya me hablaron de Tie::File, muy bueno, pero reescrive el archivo y yo necesito eliminar (o modificar) Y línea sin crear archivo alguno.
¿Se puede hacerlo?
¿Cómo hacerlo?
Gracias.
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Publicidad

Notapor explorer » 2007-01-10 13:41 @611

Se puede hacer si sabes en qué lugar del fichero empieza y acaba esa línea. Podrás modificarla sólo a otra línea del mismo tamaño. No podrás borrarla ni cambiarla de tamaño porque eso implica cambiar de tamaño el fichero (todas las líneas siguientes a la modificada cambian su posición relativa dentro del fichero) y eso implica reescribir todo el fichero o al menos todas las partes que cambian.

Si el fichero, en cambio, está compuesto de registros de igual tamaño, no tendrás muchos problemas, salvo que los registros borrados ocuparán espacio innecesario.

Pero entonces llegamos a lo de siempre: una base de datos.

P.D. Hay algunos sistemas operativos que sí permiten realizar esa labor, pero sólo en el caso de borrar bloques enteros o de ponerlos a cero.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re:

Notapor Perl user » 2007-01-10 17:28 @769

Que tal,

No no creo que Tie::File reescriba el archivo por cada operación de escritura, de hecho si te fijas en los métodos de _twrite y _mwrite lo que hacen simplemente lo que harías tu si lo implementaras a mano, jugar con índices y posiciones.

Mira.. la teoría es sencilla si lo quieres implementar tú:

Por primera vez lee el archivo en su totalidad, analizando en qué posición de inicio y de fin está cada linea (tomando en cuenta dobles saltos de linea ), y guardalos en una estructura de datos interna.

De esa manera, cuando le pidas acceder y modifiar X línea lo que tienes que hacer es posicionarte con seek. No olvides abrir el archivo con opción de lectura y escritura como lo hace Tie::File.

De esta manera si tienes que leer el archivo, pero solo al lanzarlo y no tienes que almacenar nada en memoria. Solo necesitas el juego de índices de inicio y fin. Importante, evalua cualquier caso extremo que te puedas encontrar.

Tie::File lo hace de manera eficiente mapeando el array al disco, utilizando posiciones y jugando con ellas.

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor creating021 » 2007-01-13 20:44 @905

:shock: Tendré que verlo mejor.
Muchas gracias.
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 7 invitados

cron