Página 1 de 1

Guardar una línea de un archivo de entrada en otro de salida

NotaPublicado: 2019-09-30 06:12 @300
por Tharanys
Buenos días.

Soy nuevo en el mundo de la programación y quería pedir ayuda con la siguiente situación.

Tengo un archivo de entrada del que tengo que seleccionar unas líneas del archivo para guardarlas en otro.

Abro el archivo:

my $file = $ARGV[0];
unless (open(FROM,$file))
{
print STDERR "Cannot open file \"$file\"\n\n";
exit;
}

le digo que lo lea línea a línea y que me guarde el número de líneas y que cuando llegue a las que empiezan por '>' me las guarde, pero no soy capaz:

my $numerodelineas = 0;

while (<FROM>)
{
$numerodelineas++;
if ($numerodelineas =~ />/)
{
open (FILE_1,'>',"salida.txt")
print "$numerodelineas\n";
close (FILE_1)
}
}


Si podéis ayudarme os lo agradecería.

Re: Guardar una línea de un archivo de entrada en otro de sa

NotaPublicado: 2019-09-30 08:47 @407
por explorer
Bienvenido/a a Perl en Español, Tharanys.

El problema está en que la lectura de las líneas la haces a la variable por defecto ($_), pero luego no la usas para hacer la comparación. Mejor usar una variable explícita, y así se ve más claro el funcionamiento:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open (FILE_1,'>',"salida.txt");              # abrimos el archivo resultado, en escritura
  2.  
  3. while (my $linea = <FROM>) {                 # leemos el archivo, por líneas; cada línea la guardamos en $linea
  4.     if ($linea =~ /^>/) {                    # si la $linea comienza (^) por '>'
  5.         print FILE_1 $linea;                 # imprimimos la $linea en FILE_1
  6.     }
  7. }
  8. close (FILE_1);                              # cerramos archivo resultado
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Fíjate que abrimos y cerramos el archivo resultado una sola vez, antes y después del bucle, no dentro de él. Si lo hiciéramos dentro, estarías sobreescribiendo el contenido anterior cada vez que encontrases una nueva línea.

Una vez entendido cómo se hace esto, Perl te permite escribirlo de forma más abreviada:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open (FILE_1,'>',"salida.txt");              # abrimos el archivo resultado, en escritura
  2.  
  3. while (<FROM>) {                             # leemos el archivo, por líneas; cada línea la guardamos en $_
  4.     if (/^>/) {                              # si la $_ comienza (^) por '>'
  5.         print FILE_1;                        # imprimimos la $_ en FILE_1
  6.     }
  7. }
  8. close (FILE_1);                              # cerramos archivo resultado
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

La variable $_ (la de por defecto) nos permite realizar operaciones que la van a usar si no se indica ninguna otra variable.

Si estás empezando, mejor usa el primer método, y poco a poco vas pasando al segundo. Pero siempre que en el programa quede claro qué es lo que estás haciendo.

Re: Guardar una línea de un archivo de entrada en otro de sa

NotaPublicado: 2019-09-30 15:39 @693
por Tharanys
Muchísimas gracias.

Ahora lo entendí y conseguí generar el archivo correcto de salida.

Mil gracias :)