• Publicidad

Sacar información de un archivo

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

Sacar información de un archivo

Notapor ricky_jr » 2009-08-19 17:46 @782

¿Qué hay, amigos perleros?

Tengo un nuevo problema: supongamos que tengo un archivo con texto y es importante sacar información de ahí; ejemplo: tengo en una línea puerto y me interesa imprimir lo que hay en esa línea donde está esa palabra y así con otras más palabras claves que me tendrán que arrojar información que contiene esa línea y tengo este pobre código...

Espero me puedan ayudar...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. $file='/root/serverconfesp';
  4.   open(FILE,"$file") or $msg = "File error";
  5.         my @linea = <FILE>;
  6.             if ("puerto" eq @linea){
  7.         print "$linea \n";
  8. }
  9. close (FILE);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Bueno, amigos, aquí hice un nuevo código que se ve más coherente, aunque sigue sin hacer nada. Espero me puedan ayudar...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. $file='/root/serverconfesp';
  4.   open(FILE,"$file") or $msg = "File error";
  5.         $_ = <FILE>;                    #estoy diciendo que cada línea sea identifique por $_
  6.           @dato = split(/\s+/,$_);      #le hago un split a $_ y lo guardo en un array @dato
  7.                $validar="$dato[0]";    #declaro una variable que contenga la cadena que voy a comparar
  8.            if ("puerto" eq $validar){         #hago un if para buscar la palabra que quiero
  9.         print "@dato \n";         #pretendo que se imprima la línea completa donde se encontró la palabra en este caso puerto  
  10. }
  11. close (FILE);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2009-08-19 19:20 @847, editado 1 vez en total
Razón: Ortografía, bloques de código
ricky_jr
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2009-08-12 21:07 @921

Publicidad

Re: Sacar información de un archivo

Notapor explorer » 2009-08-19 19:34 @857

Sería interesante ver un ejemplo del fichero de entrada. Al menos, la línea interesante, porque según el código, está en la primera columna.
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: Sacar información de un archivo

Notapor ubuntu » 2009-08-19 20:00 @875

Buenas ricky_jr.

Yo para buscar algo en un archivo suelo hacer esto :

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/per -w
  2.  
  3. open(leearchivo,"<archivo.txt"); #abrimos el archivo
  4. @datos =<leearchivo>; #recogemos las lineas del archivo en un array
  5.  foreach $datos_tmp(@datos) #pasara los datos almacenados en el array a la variable escalar $datos_tmp ,en cada salto de linea del archivo
  6.  {
  7.  @separa_datos = split(" ",$datos_tmp); #separamos los datos de cada linea por espacios
  8.   if ($separa_datos[0] eq "Puerto") #comprobamos la primera linea  que coincida con lo que buscamos ( Puerto )
  9.   {
  10.   print "$separa_datos[1]"; #imprimiria 1234
  11.   }
  12.  }
  13.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


bueno este es un ejemplo, suponiendo que en el archivo tuvieras algo parecido a esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Archivo de ejemplo

Web perlenespanol.com
Puerto 1234
Nick ubuntu
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Espero te sirva de ayuda, seguramente haya alguna forma más fácil, yo es de las única que sé, a ver si nos dicen otro método.

Saludos
Avatar de Usuario
ubuntu
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2009-08-19 07:30 @354

Re: Sacar información de un archivo

Notapor Leo_Gutierrez » 2009-08-19 20:49 @909

O más resumido:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. open(FILE, '<', "file.txt") or die("No se pudo abrir el archivo.");
  5. while(<FILE>)
  6. {
  7.         print if($_ =~ /puerto/i)
  8. }
  9. close(FILE);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Leo_Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 91
Registrado: 2008-08-20 23:38 @026

Re: Sacar información de un archivo

Notapor ricky_jr » 2009-08-19 22:06 @962

¿Qué hay? ¿Saben? Creo que he pensado en una solución aunque no sé cómo implementarla. Bueno, un ejemplo del archivo sería algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
#este es un ejemplo
#del archivo
puerto 2345

#otra de las lineas
#donde me doy cuenta
ip 198.162.44.3
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Las líneas que yo necesito no tiene el carácter "#" entonces la misión es sacar todas las líneas del archivo que no tengan este carácter "#". Creo que esta sería una mejor solución ya que son muchas las líneas que necesito extraer del archivo y ninguna cuenta con el carácter...
Última edición por explorer el 2009-08-20 02:29 @145, editado 1 vez en total
Razón: Ortografía, bloques de código
ricky_jr
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2009-08-12 21:07 @921

Re: Sacar información de un archivo

Notapor Leo_Gutierrez » 2009-08-19 22:10 @965

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. open(FILE, '<', "file.txt") or die("No se pudo abrir el archivo.");
  5. while(<FILE>)
  6. {
  7.         if($_ !~ /^#/)
  8.         {
  9.                 print;
  10.         }
  11. }
  12. close(FILE);
  13. exit(0)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while(<FILE>)
  2. {
  3.         print if($_ !~ /^#/)
  4. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Leo_Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 91
Registrado: 2008-08-20 23:38 @026

Re: Sacar información de un archivo

Notapor explorer » 2009-08-20 03:04 @170

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;

open my $fichero, q[<], 'file.txt' or die "ERROR: No se pudo abrir el archivo: $!\n";
my @fichero = grep { ! /^#/ } <$fichero>;
close $fichero;

# @fichero contiene las líneas interesantes
Coloreado en 0.001 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: Sacar información de un archivo

Notapor ricky_jr » 2009-08-20 07:43 @363

De entrada les agradezco sus respuestas aunque hay un problema: soy muy novato y no entiendo muy bien el flujo del programa.

Por ejemplo, algunos símbolos como qué es esto: q[<], en la línea del grep() qué está pasando o en la sentencia if($_ !~ /^#/), esos símbolos no los entiendo. Ya los investigué pero no me dicen mucho. Tal vez me los pudieran explicar.

Gracias una vez más.
Última edición por explorer el 2009-08-20 07:52 @369, editado 1 vez en total
Razón: Ortografía
ricky_jr
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2009-08-12 21:07 @921

Re: Sacar información de un archivo

Notapor ubuntu » 2009-08-20 07:53 @370

Buenas.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if($_ !~ /^#/)
  2.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


if Es una Estructura Condicional Simple
$_ Es la cadena que devuelve
!~ Es una condición de comparación ( dice Sino es /^#/)
/^#/ La cadena que queremos comprobar
Resumiendo :
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
if (Si en este texto ($_), No esta (!~) Esto # (/^#/)) hace esto
{
lo que sea
}
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Saludos
Avatar de Usuario
ubuntu
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2009-08-19 07:30 @354

Re: Sacar información de un archivo

Notapor explorer » 2009-08-20 08:03 @377

q[<] es el operador de entrecomillado. Es lo mismo que escribir '<', lo que pasa es que es más ostentoso y gordo, para llamar la atención :)

if ($_ !~ /^#/) es la forma larga de escribir
if (!/^#/), que, hace años, hubiéramos escrito como
unless (/^#/), pero que no es recomendable usar (pero sí legal).

La variable $_ es la llamada "por defecto". Es la que usarán las primitivas del lenguaje en caso de que no usemos ninguna otra.

Así, si decimos print;, en realidad estaremos haciendo print $_;

La expresión regular /^#/ quiere decir: "Un # al comienzo de la línea (^)", que es justo lo que buscamos.

De esa forma, if (! /^#/) se refiere a "si la línea no comienza por '#', haz ...".

Finalmente:
my @fichero = grep { ! /^#/ } <$fichero>;
Lo que ocurre es que leemos del $fichero todas las líneas (estamos en contexto de lista por efecto del grep). Cada línea llega a grep(), que lo hace pasar por la expresión que está entre llaves. Como es una expresión regular, comprueba si la línea (que reside en $_ aunque no la veamos), coincide con el patrón "iniciar con #". Al resultado de eso, lo niega, por efecto del '!', por lo que en realidad buscamos por líneas que NO empiecen por '#'. Si la línea sale del grep con un aprobado, es ingresada en @fichero. Sino, es descartada. grep() sirve para hacer filtrado de listas de valores.

Queda más corto decir: "quiero guardar en el arreglo @fichero todas las líneas que cumplan con la condición 'no empiezan por #', provenientes del $fichero que estoy leyendo".
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

Siguiente

Volver a Básico

¿Quién está conectado?

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