• Publicidad

Compresor y descompresor de archivos

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

Compresor y descompresor de archivos

Notapor meme69 » 2006-05-25 12:39 @569

Necesito diseñar en Perl un compresor y un descompresor de archivo de texto

Ayudenmé, por favor.
meme69
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2006-05-25 12:36 @566

Publicidad

Notapor explorer » 2006-05-25 14:52 @661

Hay muchas formas de hacerlo. Ahí va una propuesta:
1.- Vas leyendo el fichero de texto línea a línea.
2.- Los espacios en blanco y caracteres de puntuación (puntos, comas, etc.) los trasladas al fichero comprimido tal cual
3.- Por cada palabra que encuentres en la línea...
4.- Si la palabra no existe en el diccionario, la agregamos a él y le damos un número en valor creciente por cada palabra (la primera palabra valdrá 1, la segunda 2, etc. etc.
5.- Sino, si la palabra ya estaba en el diccionario, la sustituímos por el valor de diccionario (por ejemplo, si la palabra 'deberes' tiene en el diccionario el valor 12, la(s) siguiente(s) veces que encontremos esa palabra la sustituímos por ese valor).

El proceso de descompresión es el mismo que el de comprimir: cada vez que encontramos una palabra, la agregamos al diccionario, y si es un número, sacamos esa palabra de él.

Como ves, hay un fallo en este sistema, si en el texto hay números además de palabras...
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

Notapor monoswim » 2006-05-25 15:20 @680

Pero con una pequeña ayudita se puede: si encuentras números los colocas entre paréntesis...Y al descomprimir si encuentras paréntesis simplemente los sacas....je

Saludos
PD: Se me acaba de ocurrir, pero no le encuentro fallos, debería de funcionar...
PD: Este es el método más fácil, porque en verdad lo que deberías de hacer es hacer un algoritmo por cada A (por ejemplo) que haya en el fichero pueda reproducir su posición, así al descomprimir vuelva a colocar la A en su lugar, solo viajaría una sola letra y su algoritmo, pero estos son más complicados...
MonoSwim
Perl Programming Language
Avatar de Usuario
monoswim
Perlero nuevo
Perlero nuevo
 
Mensajes: 452
Registrado: 2003-11-18 16:13 @717
Ubicación: Buenos Aires

Notapor explorer » 2006-05-25 16:12 @717

Pues no... siempre existe el fallo de encontrar en el texto original el mismo código que se está creando en el comprimido.

Por eso los compresores trasladan todo el contenido de un 'namespace' a otro. De un fichero (sea texto o binario) con un contenido (que no nos importa) o otro cuyo contenido sí sabemos cómo leerle (descomprimirlo, en su totalidad). A la hora de hacer la compresión, trasladamos todo el contenido original a un nuevo formato, sin crear excepciones. La forma de hacerlo es lo que distingue a un método de compresión de otro.

El algoritmo de los ficheros zip se basa también en algoritmos de diccionarios.
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

Notapor kidd » 2006-05-25 20:24 @892

Hola:

Checate el módulo Compress::AsciiFlate trabaja más o menos en la línea que maneja explorer.
http://search.cpan.org/~jimi/Compress-A ... iiFlate.pm


Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor macgregor » 2006-05-29 04:31 @229

Hola, si lo que quieres hacer es crear tu propio compresor te recomiendo que mires los diferentes algoritmos de compresión que existen.
Uno de los más intuitivos es el propuesto por explorer.
Y uno de los más potentes y relativamente fácil de comprender y programar es el altoritmo de Huffman.
Te recomiendo que mires en google, hay cientos de páginas que lo explican.
Los programas que todos conocemos como WinZip, rar, ace... en el fondo tienen uno de esos algoritmos optimizado para comprimir un poco más, y/o un poco más rápido.

Si te interesa el tema te puedo pasar el código de los compresores basados en Huffman y en el método aritmético (más potente pero mucho más complicado) que hize en practicas de programación de la facultad. Ahunque con total seguridad encontrarás código de ejemplo en muchisimas webs.

Un saludo.
MACGREGOR [TM]
Avatar de Usuario
macgregor
Perlero nuevo
Perlero nuevo
 
Mensajes: 80
Registrado: 2004-12-09 07:32 @355
Ubicación: españa

gracias

Notapor meme69 » 2006-05-29 10:18 @471

vale gracias por todo ya tengo una idea como hacerlo
meme69
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2006-05-25 12:36 @566

Notapor meme69 » 2006-06-06 22:57 @998

Código: Seleccionar todo
open(alu , "alumnos.txt");
open(aux ,"+>auxiliar.txt");
while($linea= <alu>)
{
    @reg=$linea ;
     
   if($li=pop @reg )

   {
      
       @reg =~s/$li/0/g;
         print $li;
        print aux  "@reg";
   }
   
}
meme69
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2006-05-25 12:36 @566

Notapor meme69 » 2006-06-06 22:59 @999

pregunta como comparo un arreglo de lo que tengo en mi archivo txt

ejemplo si tengo en mi txt hola como comparo con un arreglo

ayudemme
meme69
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2006-05-25 12:36 @566

Notapor meme69 » 2006-06-06 23:31 @021

Código: Seleccionar todo
open(alu , "alumnos.txt");
open(aux ,"+>auxiliar.txt");
while($linea= <alu>)
{
   %reg=$linea;
   $linea =%reg;
    if  ($linea = ~/[A-Z]/)
   {
        $linea =~s/$linea/0/g;
         print $linea;
        print aux  "$linea";
   }
}
close(alu);
close(aux);
meme69
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2006-05-25 12:36 @566

Siguiente

Volver a Básico

¿Quién está conectado?

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