• Publicidad

Editar Logs

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

Re: Editar Logs

Notapor explorer » 2013-01-12 08:15 @385

Eso está descrito casi en la primera línea del manual de DBD::mysql. Sería algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. use DBI;
  6.  
  7. my $dbname = 'crawlerdb';
  8. my $dbhost = 'ejemplo.pe';
  9. my $dbport = 60022;
  10. my $dbuser = 'usuario';
  11. my $dbpwd  = 'pass';
  12.  
  13. ## Conectarse a la base de datos
  14. ##
  15. my $dsn = "DBI:mysql:database=$dbname;host=$dbhost;port=$dbport";
  16.  
  17. my $dbh = DBI->connect( $dsn, $dbuser, $dbpwd )
  18.     or die "Error de conexion: $DBI::errstr\n";
  19.  
  20. ## Preparar la sentencia de insercion en la base de datos
  21. my $sth = $dbh->prepare( "insert into direcciones ( nombre) values ( ? )" );
  22.  
  23. ## Insertar un registro en la tabla
  24. ##
  25. $sth->execute("abc.pe");
  26.  
  27. ## Leer los registros de la tabla
  28. ##
  29. $sth = $dbh->prepare("select nombre from direcciones");
  30. $sth->execute();
  31. while ( my $row = $sth->fetchrow_hashref ) {
  32.     print "id: "     . $row->{id}     . "\n";
  33.     print "nombre: " . $row->{nombre} . "\n";
  34.  
  35. }
  36.  
  37. ## Desconectarse de la base de datos
  38. ##
  39. if ( !$dbh->disconnect ) {
  40.     warn "Error al desconectarse de la base de datos: $DBI::errstr\n";
  41. }
  42.  
Coloreado en 0.003 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: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Re: Editar Logs

Notapor crodriguez » 2013-01-12 11:10 @507

Hola... Muchas gracias por la ayuda con la BD. Ya me conecta y me registra lo que le pongo ahí y también me funciona bien lo que es el script para editar los logs. Ahora quisiera hacer una consulta de cómo podría hacer para unir los dos scripts en uno solo.

Bueno, a mi se me ocurrió en el primero implementar un método con un bucle que me ingrese cada línea del archivo nuevo que genero con los URL filtrados, pero no sé qué me recomiendas que haga.

Nuevamente, muchísimas gracias, ¡tu foro es un éxito!

Bueno, recién hice esto. Acá intento leer el archivo línea a línea e insertar cada línea a la base de datos:

#!/usr/bin/perl
use v5.12;
use autodie;
my %url;

use strict;
use warnings;

use DBI;

my $dbname = 'crawlerdb';
my $dbhost = '127.0.0.1';
my $dbport = 3306;
my $dbuser = 'usuario';
my $dbpwd = 'pass';


$linea
open my $LOG2, '>', '/root/logs/ns5/nuevo.1';
while(my $linea = <$LOG2>)
{
if ($linea != '')
{
print $linea;
my $dsn = "DBI:mysql:database=$dbname;host=$dbhost;port=$dbport";
my $dbh = DBI->connect( $dsn, $dbuser, $dbpwd )
or die "Error de conexion: $DBI::errstr\n";
## Preparar la sentencia de insercion en la base de datos
my $sth = $dbh->prepare( "insert into direcciones ( nombre) values ( ? )" );
## Insertar un registro en la tabla
##
$sth->execute("$linea");
## Leer los registros de la tabla
##
$sth = $dbh->prepare("select nombre from direcciones");
$sth->execute();
while ( my $row = $sth->fetchrow_hashref )
{
print "id: " . $row->{id} . "\n";
print "nombre: " . $row->{nombre} . "\n";
}
## Desconectarse de la base de datos
##
if ( !$dbh->disconnect )
{
warn "Error al desconectarse de la base de datos: $DBI::errstr\n";
}
}
}
close $LOG2;


Nuevamente, muchas gracias :D

PD: para poder evitar replicas en la base de datos ¿se podría usar algún condicional que me diga si ya existe ese nombre, y si no existe que lo inserte, o de lo contrario, que pase al siguiente?
crodriguez
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2012-12-29 20:19 @888
Ubicación: Peru

Re: Editar Logs

Notapor explorer » 2013-01-13 11:36 @525

Si la URL la guardas en un campo que antes lo has definido como clave de la tabla a la que pertenece, el motor de búsqueda no te permitirá crear un nuevo registro.

Yo creo que la solución más cómoda es usar siempre UPDATE: si el registro existía, será sobreescrito con el nuevo, y si no existía, será creado.

Lo bueno de esto es que puedes tener un campo de tipo timestamp, que se actualizará con la fecha de la última actualización, y así tendrás una medición de cuándo fue la última vez que viste cada URL.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Editar Logs

Notapor crodriguez » 2013-01-13 23:28 @019

Bueno, a ver si te entendí bien. O sea, tendría que poner un solo campo en mi tabla que va a ser el URL y a la vez, ¿éste sería el primary key? Y una cosa más. En el código anterior estoy intentando abrir el nuevo fichero con los datos filtrados para meter cada uno a la BD pero me da un error al recorrer el fichero. No sé si me puedas ayudar con eso, porque me funciona el insert en el primer script que me filtra los logs y me genera uno nuevo pero se pasan algunos caracteres en el nuevo log, así que los edito manualmente y lo guardo ya que son pocos por eso quería hacer un nuevo script que me lea el nuevo log y como van a estar todas las URL ordenadas verticalmente, ingresar cada una a la BD con el código anterior pero me da error y no he podido solucionarlo.

[root@crawler ~]# perl /root/logs/ns5/final.pl
Global symbol "$linea" requires explicit package name at /root/logs/ns5/final.pl line 19.
syntax error at /root/logs/ns5/final.pl line 19, near "$linea
open "
Execution of /root/logs/ns5/final.pl aborted due to compilation errors.
[root@crawler ~]#

Nuevamente te agradezco por todo el apoyo...
crodriguez
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2012-12-29 20:19 @888
Ubicación: Peru

Re: Editar Logs

Notapor explorer » 2013-01-14 08:05 @378

Perl te avisa de que hay un error sintáctico.


Tienes un

$linea

solitario.

Debes escribirlo como

my $linea;

No es necesario que la tabla solo tenga un campo. Habrá tantas columnas como tu quieras. La cuestión es a la hora de hacer los INSERT o UPDATES: el motor de la base de datos se fijará en los campos que son clave para garantizar su unicidad. Entonces, tu intentas hacer el INSERT o el UPDATE, y la base de datos responderá con un acierto o con un fallo (indicando que ya existía la clave), pero no importa ninguno de los dos, porque suponemos que funciona bien cuando se hace la inserción de un elemento que no existía. El caso es que si solo haces UPDATES, lo tienes resuelto, porque esa es la misión de UPDATE: agregar registros sobreescribiendo a los anteriores o creando nuevos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Anterior

Volver a Básico

¿Quién está conectado?

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