• Publicidad

Lectura de datos de fichero

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

Lectura de datos de fichero

Notapor xigr » 2006-05-05 06:30 @312

¡Hola a todos!

No logro hacer la lectura de datos de un fichero. Antes, manualmente, yo sacaba un gran listado de IP, y puestos en columna en un fichero se lo "pasaba" al [i]script[/i] para que fuera diagnosticando... pero como el proceso tengo que repetirlo cada ciertos días quería automatizarlo con la extracción de datos que hago por otro [i]script[/i] que conecta a una MySQL.

El problema es que no logro hacer leer las IP de las columnas. Le digo la posición pero ni caso. Lo normal es que no me salga el 'select', pero bueno, eso ya haré algún apaño por si aparece que se lo salte. Yo debo leer a partir del primer [b]0001-11111-x1[/b] hasta el final.

¿Me podéis echar una mano? :? Ya no sé qué más probar con tantas variables. En principio cuenta a partir de la fila 4 o 5 y la columna 5. Están separados por espacios... o sea, que hasta la primera IP en el programa de texto me dice columna 67...

Muchas gracias
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
_serv as h, estado as e ,
n_FR_ChB2  from hist_esta_serv as h, estado as e , +++++++++++++++++ servicio
+-----------------+--------+----------+--------+----------------+----------------+-------------------+-------------------+
| identxxxxxxxxFK | Numero | Nombre   | Nombre | IPGestionxx    | IPGestionxxxx  | IPGestion_Xx_xxx1 | IPGestion_Xx_Xxx2 |
+-----------------+--------+----------+--------+----------------+----------------+-------------------+-------------------+
| 0001-11111-x1   |   1111 | xxxxx 0  | xxxx   | NULL           | 172.30.113.10  | NULL              | NULL              |
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
xigr
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2006-02-03 02:51 @160

Publicidad

Notapor explorer » 2006-05-05 07:12 @341

Yo necesitaría más información.

¿Puedes poner un extracto del código, la parte que lee las IP?

¿Puedes poner un DESCRIBE de tu tabla de datos MySQL?
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 xigr » 2006-05-05 07:40 @361

Pues a ver, lo que tengo ahora puesto es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while ( $registro = <FILE> ) {
  2.     @datos = split( /\n/, $registro );
  3.     $host = $datos[5], 64;
  4.     $cont++;
  5.     $marca = 0;
  6.  
  7.     my $session = Net::Telnet->new( Host => $host, Errmode => sub { &error; } );
  8.  
  9.     if ( $marca == 0 ) {
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Lo del DESCRIBE... ¡Puff! Es que hay enlazadas como 4 tablas :\\ Pero puedo decirte que están como 'varchar' si es lo que quieres saber, y el resto de campos.
xigr
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2006-02-03 02:51 @160

Notapor explorer » 2006-05-05 08:23 @391

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. ( $registro = <LINE> ) {
  2.     @datos = split / *\| */, $x;
  3.     $host = $datos[6];
  4.     if ( $datos[1] eq '0001-11111-x1' ) {
  5.         $dentro = 1;
  6.     }
  7.     if ($dentro) {
  8.  
  9.         # Procesar IP
  10.         print $host, "\n";
  11.     }
  12.  
  13.     # ...
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

Notapor xigr » 2006-05-09 06:12 @300

Hola de nuevo.

No sé qué hago mal, no me sale.

Bueno, he cambiado el 'eq' ya que no siempre es ese valor. He intentado hacer que sí empiece por '0001-' el resto cambia... yo originalmente lo tengo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Net::Telnet;
  2.  
  3. sub error {
  4.     my ($dato) = @_;
  5.     $marca = 1;
  6.     if ( index( $dato, "connec" ) != -1 ) {
  7.         print "*** Timeout *** No se puede entrar en " . $cont . ": " . $host . "\n";
  8.     }
  9. }
  10.  
  11. $fallo = 0;
  12. $bien  = 0;
  13. open( FILE, $ARGV[0] ) || die("No se puede abrir el fichero\n");
  14.  
  15. if ( scalar(@ARGV) == 0 ) {
  16.     print scalar(@ARGV);
  17. }
  18. while ( $registro = <FILE> ) {
  19.     @datos = split( /\n/, $registro );
  20.     $host = $datos[0];
  21.     $cont++;
  22.     $marca = 0;
  23.     $con   = 0;
  24.  
  25.     my $session = Net::Telnet->new( Host => $host, Timeout => 20, Errmode => sub { &error; } );
  26.  
  27.     if ( $marca == 0 ) {
  28.  
  29.         # logamos
  30.         print "Accediendo al router " . $cont . ": " . $host . "\n";
  31.         if ( $session->waitfor( String => 'Username:' ) ) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
xigr
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2006-02-03 02:51 @160

Notapor explorer » 2006-05-10 11:44 @530

No me entero... ¿Podrías poner un trozo del fichero de entrada?
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 xigr » 2006-05-11 04:35 @233

¡sip! A ver si no se mueve mucho al pegarlo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
+-----------------+--------+----------+--------+----------------+----------------+-------------------+-------------------+
| identServicioFK | Numero | Nombre   | Nombre | IPGestionFR    | IPGestionADSL  | IPGestion_FR_ChB1 | IPGestion_FR_ChB2 |
+-----------------+--------+----------+--------+----------------+----------------+-------------------+-------------------+
| 0001-01111-S1   |   1111 | xxxxx 0  | Alta   | NULL           | 172.30.xxx.Xx  | NULL              | NULL              |
.
.
.
| 0001-01111-S1   |   1111 | xxxxx 8  | Alta   | 172.21.xxx.xxx | 172.21.xxx.xxx | NULL              | NULL              |
+-----------------+--------+----------+--------+----------------+----------------+-------------------+-------------------+
2008 rows in set (2.47 sec)

mysql> select ................. ;
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
xigr
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2006-02-03 02:51 @160

Notapor explorer » 2006-05-11 05:53 @286

A ver si lo entendí...

Supongamos que tenemos un fichero de texto así llamado kk.txt:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
+-----------------+--------+----------+--------+----------------+----------------+-------------------+-------------------+
| identServicioFK | Numero | Nombre   | Nombre | IPGestionFR    | IPGestionADSL  | IPGestion_FR_ChB1 | IPGestion_FR_ChB2 |
+-----------------+--------+----------+--------+----------------+----------------+-------------------+-------------------+
| 0001-01111-S1   |   1111 | xxxxx 0  | Alta   | NULL           | 172.30.xxx.Xx  | NULL              | NULL              |
| 0001-01111-S1   |   1111 | xxxxx 8  | Alta   | 172.21.xxx.xxx | 172.21.xxx.xxx | NULL              | NULL              |
| 0001-01111-S1   |   1111 | xxxxx 8  | Alta   | 172.21.xxx.xxx | 172.22.xxx.xxx | NULL              | NULL              |
| 0001-01111-S1   |   1111 | xxxxx 8  | Alta   | 172.21.xxx.xxx | 172.23.xxx.xxx | NULL              | NULL              |
| 0001-01111-S1   |   1111 | xxxxx 8  | Alta   | 172.21.xxx.xxx | 172.24.xxx.xxx | NULL              | NULL              |
| 0001-01111-S1   |   1111 | xxxxx 8  | Alta   | 172.21.xxx.xxx | 172.25.xxx.xxx | NULL              | NULL              |
| 0001-01111-S1   |   1111 | xxxxx 8  | Alta   | 172.21.xxx.xxx | 172.26.xxx.xxx | NULL              | NULL              |
| 0001-01111-S1   |   1111 | xxxxx 8  | Alta   | 172.21.xxx.xxx | 172.27.xxx.xxx | NULL              | NULL              |
| 0001-01111-S1   |   1111 | xxxxx 8  | Alta   | 172.21.xxx.xxx | 172.28.xxx.xxx | NULL              | NULL              |
| 0001-01111-S1   |   1111 | xxxxx 8  | Alta   | 172.21.xxx.xxx | 172.29.xxx.xxx | NULL              | NULL              |
| 0001-01111-S1   |   1111 | xxxxx 8  | Alta   | 172.21.xxx.xxx | 172.31.xxx.xxx | NULL              | NULL              |
| 0001-01111-S1   |   1111 | xxxxx 8  | Alta   | 172.21.xxx.xxx | 172.41.xxx.xxx | NULL              | NULL              |
+-----------------+--------+----------+--------+----------------+----------------+-------------------+-------------------+
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Entonces, con un programa así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4.  
  5. my $dentro = 0;
  6.  
  7. open DB, "<kk.txt" or die "ERROR: No pude abrir kk.txt: $!\n";
  8. while ( my $linea = <DB> ) {
  9.   my @datos = split(/ *\| */, $linea, 8);
  10.   next unless @datos == 8;
  11.   if ( $datos[1] eq '0001-01111-S1' ) {
  12.     $dentro = 1;
  13.   }
  14.   if ( $dentro ) {
  15.     # Procesar IP que está en print $datos[6]
  16.     print $datos[6],"\n";
  17.   }
  18. }
  19. close DB;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
da como resultado esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
172.30.xxx.Xx
172.21.xxx.xxx
172.22.xxx.xxx
172.23.xxx.xxx
172.24.xxx.xxx
172.25.xxx.xxx
172.26.xxx.xxx
172.27.xxx.xxx
172.28.xxx.xxx
172.29.xxx.xxx
172.31.xxx.xxx
172.41.xxx.xxx
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Naturalmente, siendo una base de datos MySQL, sería más cómodo usar el módulo DBI para hacer la select y extraer los datos, que no leyéndola de esta manera...

En esta solución usamos el truco de usar split() para dividir la línea que está separada por '|' (en caso de que no obtengamos 8 campos leídos, es que es una de las líneas con '-' y la descartamos).

La variable $dentro nos la podemos ahorrar si estamos seguros que en la columna de las IP siempre hay algún número.

Entonces, quitamos el 'if ($datos[1] ...' y cambiamos el 'if ( $dentro )' por 'if ( $datos[6] =~ /\d/ ) {'.

Quedaría así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. open DB, "<kk.txt" or die "ERROR: No pude abrir kk.txt: $!\n";
  3. while ( my $linea = <DB> ) {
  4.   my @datos = split(/ *\| */, $linea, 8);
  5.   next unless @datos == 8;
  6.   if ( $datos[6] =~ /\d/ ) {
  7.     # Procesar IP que está en print $datos[6]
  8.     print $datos[6],"\n";
  9.   }
  10. }
  11. close DB;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Si lo que queremos es procesar la IP sólo cuando el primer campo de la base de datos se parezca a '0001-01111-?1', entonces cambiamos el if:

if ( $datos[1] =~ /^0001-01111-.1$/ ) {

etc., etc.
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 xigr » 2006-05-18 04:00 @208

Hola, explorer, gracias por responder.

Disculpa que no pudiera hacerlo antes (encima de que me ayudas :s). El problema es que mi máquina no me accede directamente a la MySQL y tengo un script que sí lo hace entrando a una UNIX por ssh y después a MySQL... Me los descarga y los deja en Linux (usando expect como si manualmente tecleara yo).

Muchas gracias por todo. Voy a echarle mano a ver cómo me va.

Por ahora sé que desde donde ejecuto los scripts (mi Linux) llego por ping a la máquina donde está MySQL. Así que supongo que o me lo capan por cortafuegos o por la configuración, ya que con la UNIX en mi misma LAN si accedo a la base de datos. Voy a intentar averiguar donde está la máquina y quién la administra... Porque me ahorraría mucho tiempo poder hacer scripts desde la Linux que capturen los datos directamente.

Muchas gracias otra vez :)

¡¡¡Saludos!!!
iñaki.
xigr
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2006-02-03 02:51 @160

Notapor xigr » 2006-05-19 05:28 @269

Al final me permiten la ejecución desde la UNIX, ¡ji,ji,ji,ji! Así que he utilizado otro módulo de Perl para sacar los datos y dejarlos con un fichero plano.
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
0001-03501-T1   3501    Xxxx xxx 62     Alta    172.xx.xxx.xxx
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

y como puede tener hasta dos IP pero me salen en columnas diferentes pues ya pondré que mire si hay IP o si hay un espacio en blanco :)

Muchas gracias, explorer :)
xigr
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2006-02-03 02:51 @160

Siguiente

Volver a Básico

¿Quién está conectado?

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