• Publicidad

Modificar un fichero con el contenido de otro

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

Modificar un fichero con el contenido de otro

Notapor boteropepe » 2010-03-24 13:09 @590

Hola, tengo dos ficheros; en uno, tengo esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Animales:
                                        <aire>
                                        <tierra>
                                        <agua>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


y en el otro fichero, esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
carpa agua
caballo tierra
cerdo tierra
trucha agua
gorrión aire
mosca aire
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Lo que quiero, es generar un fichero con este contenido:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Animales:
                                        gorrión
                                        mosca
                                        caballo
                                        cerdo
                                        carpa
                                        trucha
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


O sea, me gustaría poder sustituir el contenido del primer fichero que aparece entre <> por el contenido del segundo. Ni siquiera sé si se puede sustituir el contenido de un fichero con un programa en Perl, sin producir un fichero nuevo (pero esto no me importa tanto, en realidad).

Por otro lado, no sé cómo se leen dos ficheros a la vez, cómo se toma el contenido de uno para copiarlo en el otro, etc.

Por supuesto, no pido que nadie me haga el programa, pero agradezco cualquier pista (si acaso, por lo menos para poder encontrar todo lo necesario en los libros de O'Reilly)

Muchas gracias
boteropepe
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2010-03-08 15:14 @676

Publicidad

Re: Modificar un fichero con el contenido de otro

Notapor explorer » 2010-03-24 13:23 @599

Por cada fichero que quieras leer debes hacer un open() para abrirlo.

Podrías leer primero el segundo fichero, guardando cada animal en un arreglo distinto según pertenezca a un medio distinto.

Luego, podrías leer el primer fichero, y cuando encontrases una etiqueta '<>', sustituyes el contenido por una serie de líneas, una por cada animal de ese medio encontrado.

¡Adelante!
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: Modificar un fichero con el contenido de otro

Notapor panterozo » 2010-03-25 12:11 @549

Me tinka que debe ser algo así:
(les pondré extensiones .txt si no es molestia ;) )

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open FICHERO, "<fichero.txt"; #Saca los datos de fichero.txt
while(<FICHERO>){
    print $_;#Aquí te muestra línea por línea del archivo fichero.txt
             #Bastaría con que guardases sus datos en un arreglo
}
close FICHERO;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Si quieres sobrescribir en el archivo ANIMALES.txt, sería

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open FICHERO2, ">ANIMALES.txt";
foreach (@arreglo){
   print FICHERO2 $_."\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Si te fijas en open(), aparece estos tags "<", para leer, ">" para escribir. Esto último lo confirmo si así es...

(CONFIRMADO)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use strict;
open N, "<hola.txt";
my @arreglo;
my $i=0;
while(<N>){
        $arreglo[$i]=$_;
        $i++;
        }
close (N);
open NN,">hola.txt";
foreach(@arreglo){
        print NN "hola ".$_."\n";
        }
close (NN);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


No pude evitar hacer algo por el estilo :s... algo como eso es lo que quieres, creo :s...

En el documento hola.txt, se extraen los datos al @arreglo, para luego volver a escribir en el mismo archivo (con sobreescritura) hola y el valor que se sacó anteriormente.

Espero te sirva

saludos
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Re: Modificar un fichero con el contenido de otro

Notapor boteropepe » 2010-03-29 11:51 @535

Muchas gracias a los dos, estoy esperando tener tiempo para poder intentarlo (ha venido mucho trabajo de repente), ¡gracias de nuevo!
boteropepe
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2010-03-08 15:14 @676

Re: Modificar un fichero con el contenido de otro (más)

Notapor boteropepe » 2010-04-08 15:15 @677

Hola, escribo aquí porque mi problema es el mismo ahora, solo que se me ha complicado un poco más.

Ahora tengo un fichero con este contenido:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
toro    toro
vaca    toro
ternero toro
ternera toro
caballo caballo
yegua   caballo
potro   caballo
mulo    caballo
burro   caballo
gallina gallo
gallo   gallo
pollito gallo
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Y otro fichero con esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
"toro"          rumiante: vive en los pesebres
"serpiente"     alimaña: vive salvaje
"caballo"       rumiante: vive en las cuadras
"gallo"         ave de corral: vive en el gallinero
"gato"          animal de compañía: vive en la casa
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Como en el caso anterior, lo que querría es sustituir 'toro' en el fichero 2 por 'vaca', 'ternera', etc. (una sustitución por línea), y no perder las líneas de 'gato' y 'serpiente' (que no aparecen en el fichero 1). He probado de varias maneras y siempre me falla algo. Haciendo esta última prueba de abrir un fichero dentro del otro y cerrarlos solo al final, no consigo averiguar cómo puedo hacer para que las líneas de 'gato' y 'serpiente' también aparezcan. Dejo aquí el programa, por si alguien me puede orientar, explicarme qué hago mal y cómo puedo hacerlo mejor o lo que quiera:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use locale;
  4.  
  5. open (FILE_1, "$ARGV[0]");
  6.   while (<FILE_1>) {
  7.     chomp;
  8.     my %tipo_animal;
  9.     my ($animal, $tipo) = split (/\t/,$_);
  10.     push (@{$tipo_animal{$tipo}}, $animal);
  11.  
  12.     open (FILE_2, "$ARGV[1]");
  13.       while (<FILE_2>) {
  14.         chomp;
  15.         foreach $tipo (keys %tipo_animal) {
  16.           if ($_ =~ /"$tipo"/) {
  17.             $_ =~ s/(.*)"$tipo"(.*)/$1"@{$tipo_animal{$tipo}}"\t$2/;
  18.             print "$_\n";
  19.           }
  20.         }
  21.       }
  22.     close FILE_2;
  23.   }
  24. close FILE_1;
  25.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Muchas gracias.
Última edición por explorer el 2010-04-08 15:43 @696, editado 1 vez en total
Razón: Formateo, bloques de código
boteropepe
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2010-03-08 15:14 @676

Re: Modificar un fichero con el contenido de otro

Notapor explorer » 2010-04-08 16:55 @746

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. # Leer el primer fichero
  7. my %animales;
  8.  
  9. open my $fichero1, q[<], 'kk1.txt' or die "ERROR: No puedo leer kk1.txt: $!\n";
  10.  
  11. while (<$fichero1>) {
  12.     chomp;
  13.  
  14.     my ($valor, $clave) = split;
  15.  
  16.     push @{ $animales{$clave} }, $valor;                # creamos una estructura de un hash de arrays
  17.                                                         # $animales{animal} => [ familiar1, familiar2, ... ];
  18. }
  19.  
  20. close   $fichero1;
  21.  
  22.  
  23. # Leer el segundo fichero
  24. open my $fichero2, q[<], 'kk2.txt' or die "ERROR: No puedo abrir kk2.txt: $!\n";
  25.  
  26. while (my $linea = <$fichero2>) {
  27.  
  28.     print $linea;                                       # sacamos la propia línea
  29.  
  30.     my ($animal) = $linea =~ /^"(\w+)/;                 # ver qué animalejo es
  31.  
  32.     for my $otro_animal ( @{ $animales{ $animal } } ) { # para toda su familia
  33.  
  34.         next if $animal eq $otro_animal;                # excepto él mismo (ya lo hemos sacado antes)
  35.  
  36.         $linea =~ s/^"\w+/"$otro_animal/;               # sustitución
  37.  
  38.         print $linea;                                   # impresión
  39.     }
  40. }
  41.  
  42. close   $fichero2;
  43.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
"toro"          rumiante: vive en los pesebres
"vaca"          rumiante: vive en los pesebres
"ternero"          rumiante: vive en los pesebres
"ternera"          rumiante: vive en los pesebres
"serpiente"     alimaña: vive salvaje
"caballo"       rumiante: vive en las cuadras
"yegua"       rumiante: vive en las cuadras
"potro"       rumiante: vive en las cuadras
"mulo"       rumiante: vive en las cuadras
"burro"       rumiante: vive en las cuadras
"gallo"         ave de corral: vive en el gallinero
"gallina"         ave de corral: vive en el gallinero
"pollito"         ave de corral: vive en el gallinero
"gato"          animal de compañía: vive en la casa
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
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: Modificar un fichero con el contenido de otro

Notapor boteropepe » 2010-04-09 06:00 @291

¡¡MUCHÍSIMAS GRACIAS!!!

No se me había ocurrido hacerlo así; además he aprendido dos cosas nuevas que no tenía ni idea de cómo hacer ni de cómo buscar (guardar el contenido parcial de una línea en una variable, sobre todo, que seguro que me sirve para mucho más).
boteropepe
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2010-03-08 15:14 @676


Volver a Básico

¿Quién está conectado?

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