• Publicidad

Carga de información de Excel a base de datos

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

Re: Carga de información de Excel a base de datos

Notapor Txemaracas » 2011-06-08 14:44 @655

He probado eso, que sería la forma correcta ahí; me he equivocado y me faltaba poner eso, pero sigue igual. No sé, seguiré mirando a ver si lo encuentro, el fallo. Muchas gracias por todo, explorer.
Txemaracas
Perlero nuevo
Perlero nuevo
 
Mensajes: 136
Registrado: 2011-04-04 10:06 @462

Publicidad

Re: Carga de información de Excel a base de datos

Notapor explorer » 2011-06-08 14:50 @659

Otra forma de depuración consiste en colocar print() en aquellos lugares sospechosos, y que saquen en pantalla el valor de las variables, para que veamos en pantalla, dónde y qué es lo que está tratando.

Así, si antes de llamar a comparar(), sacas el valor de las celdas, y ves en pantalla que son iguales, pero el programa insiste en insertar el valor, eso es que es justo en esa parte donde está el fallo (la función comparar, en este ejemplo).

Este es un método que yo uso siempre.

Incluso hay algunos módulos en Perl que ayudan a hacerlo, como Smart::Comments.
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: Carga de información de Excel a base de datos

Notapor Txemaracas » 2011-06-09 10:40 @486

He modificado un poco el código. A la subrutina le pasaba un valor que no era necesario; queda:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub comparar{
  2.  
  3.  
  4.         my($dbh,$sth);
  5.  
  6.         $dbh = $_[2];
  7.  
  8.         $sth = $dbh->prepare("SELECT * FROM $_[1]");
  9.  
  10.         $sth->execute();
  11.  
  12.         while (my $ref = $sth->fetchrow_hashref()) {
  13.  
  14.                 if  ( $_[0]->{Val} eq $ref->{'palabra'}){
  15.  
  16.                       $sth->finish();
  17.  
  18.                       return 1;
  19.                 }
  20.         }
  21.  
  22.         $sth->finish();
  23.  
  24.         return 0;
  25. }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


pero me sale el error:

DBD::mysql::st fetchrow_hashref failed: fetch() without execute() at line 12.

¿Me está diciendo que me hace falta un execute()?
Txemaracas
Perlero nuevo
Perlero nuevo
 
Mensajes: 136
Registrado: 2011-04-04 10:06 @462

Re: Carga de información de Excel a base de datos

Notapor explorer » 2011-06-09 16:52 @744

¡Qué error más raro...!

¿Seguro que lo que sigue a $sth, en esa línea es un '->'? Es decir, un guión y un '>'. Fíjate bien que a lo mejor es un carácter distinto. Yo lo borraría y lo reescribiría de nuevo.

Y quita los '()' vacíos, de fetchrow_hashref().

O quizás, $sth no tiene valor (ha fallado el prepare()).
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: Carga de información de Excel a base de datos

Notapor Txemaracas » 2011-06-10 11:33 @523

¿Sabes?, es raro porque la primera vez que lo ejecuto, que es cuando no tiene ni la base de datos creada, lo inserta todo y lo crea correctamente cuando tendría que fallar el comparar, la parte del prepare(), porque no hay ningún valor en la BD. En cambio, falla cuando lo hago la segunda vez. Es muy raro, no sé.
Txemaracas
Perlero nuevo
Perlero nuevo
 
Mensajes: 136
Registrado: 2011-04-04 10:06 @462

Re: Carga de información de Excel a base de datos

Notapor explorer » 2011-06-10 16:17 @720

El MySQL se puede configurar para que genere un log, y así puede saber qué es lo que está provocando el error.

Lo dicho... yo lo ejecutaría paso a paso con el depurador.

Más información en perldebug y perldebtut.

O usar print() para saber qué esta comparando...
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: Carga de información de Excel a base de datos

Notapor Txemaracas » 2011-06-30 11:16 @511

Hola explorer. Ya solucioné el problema y funciona correctamente pero, pensando, me di cuenta que el programa cada vez que el usuario añade una palabra nueva al archivo Excel, se añade a la base de datos, pero cuando elimina una palabra del archivo Excel no la elimina de la base de datos. He pensado, no sé si será buena idea, crear un array o una tabla hash, no sé que será más eficiente, y añadir las palabras que va leyendo del archivo Excel. De esta manera al final del programa podré comparar las palabras del array con las que tengo en la base de datos y las que no coincidan eliminarlas.

Con el array me imagino que será más simple porque, la verdad, con hash no he utilizado casi nada todavía y leyendo un poco, se crean claves para acceder a los datos, ¿no?
Txemaracas
Perlero nuevo
Perlero nuevo
 
Mensajes: 136
Registrado: 2011-04-04 10:06 @462

Re: Carga de información de Excel a base de datos

Notapor explorer » 2011-06-30 12:32 @564

¿No sería mejor sincronizar la información de la hoja Excel con la base de datos? Es decir, en cada nueva entrega de la hoja Excel por parte del usuario, pones "a cero" la base de datos, y la rellenas con la información de la hoja.

El límite es (y que yo uso mucho últimamente) usar la propia hoja Excel como la base de datos de la aplicación.

Otro tema es si la base de datos está almacenando más información que la trae la hoja Excel, como es el caso de que existan más campos o columnas, que la aplicación ha ido alimentando con el tiempo.

En ese caso, primero te lees la información de la hoja Excel a memoria, en una estructura Perl del tipo hash, en que las claves sean las palabras que pone el usuario (se supone que no hay palabras repetidas). Segundo, abres la base de datos y la vas recorriendo palabra por palabra. Y ahora, a procesar:

* Si la palabra que encuentras en la base de datos existe en la hoja Excel, eliminas su entrada en la estructura (borras la entrada hash), ya que se trata de una palabra que ya teníamos.

* Si la palabra que encuentras en la base de datos no existe en la hoja Excel, quiere decir que el usuario la ha borrado. Guardamos dicha palabra en un array para eliminar esa palabra más tarde (no ejecutamos la eliminación ahora, sino cuando terminemos de mirar todas las palabras).

* Al final del bucle, tendremos el array de palabras viejas, que eliminaremos de la base de datos, y en la estructura hash las nuevas palabras, que agregaremos.

Bueno, es una forma de hacerlo. Hay otras.

En cuanto a lo del hash y array, las prestaciones son muy parecidas, pero hash es ideal para relacionar y recordar información. Localizar información en un array implica saber su posición, o hacer un bucle para buscarla.
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: Carga de información de Excel a base de datos

Notapor Txemaracas » 2011-07-20 07:34 @357

Hola, explorer. Vale, voy a hacerlo con tabla hash pero no sé si lo he entendido bien lo de los hash. A ver, cuando yo encuentre una palabra en el Excel la usaré como clave, ¿no? Por ejemplo, sería así :?:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @tabla = ("Hello" => 121, "bye" => 143);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


luego para compararlas con las de la base de datos ¿sería sacarlas una a una con un bucle?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my  @eliminar;
  2. while (@tabla){
  3.     my pal="Hello";
  4.     if (exists $tabla{$pal}){
  5.         printf ("Si existe.\n");
  6.     }else{
  7.         $eliminar=$pal;
  8.     }
  9. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Txemaracas
Perlero nuevo
Perlero nuevo
 
Mensajes: 136
Registrado: 2011-04-04 10:06 @462

Re: Carga de información de Excel a base de datos

Notapor explorer » 2011-07-20 12:05 @545

Aquí hay un ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5. use autodie;
  6.  
  7. ## La base de datos es una organización bidimensional, a partir de un array
  8. ## Cada 'fila' contiene los datos de un registro
  9. ## Cada columna está identificada por su nombre
  10. my @base_de_datos = (
  11.     {
  12.         palabra         => 'Juan',
  13.         id              => 2,
  14.         direccion       => 'Cuadra 23',
  15.         valor           => 10_123_500,
  16.     },
  17.     {
  18.         palabra         => 'Antonio',
  19.         id              => 3,
  20.         direccion       => 'Virgencita 1',
  21.         valor           => 731_040,
  22.     },
  23.     {
  24.         palabra         => 'Luca',
  25.         id              => 5,
  26.         direccion       => 'Abeja 101',
  27.         valor           => 1_107,
  28.     },
  29. );
  30.  
  31. ## La hoja Excel es también bidimensional
  32. ## Se trata de un hash, en que la primera columna es la clave
  33. ## Y cada valor asociado es otro hash, que contiene el resto de la información
  34. my %excel = (
  35.     'Antonio'   =>      {
  36.         id              => 3,
  37.         direccion       => 'Virgencita 1',
  38.         valor           => 731_040,
  39.     },
  40.     'Luca'      =>      {
  41.         id              => 5,
  42.         direccion       => 'Abeja 101',
  43.         valor           => 1_107,
  44.     },
  45.     'Jaime'     =>      {
  46.         id              => 10,
  47.         direccion       => 'Verterra 22',
  48.         valor           => 91_992,
  49.     },
  50. );
  51.  
  52. ## Recorremos la base de datos
  53. my @palabras_borradas;                                  # aquí guardaremos las palabras a eliminar
  54.  
  55. for my $registro (@base_de_datos) {
  56.  
  57.     if (exists $excel{ $registro->{palabra} }) {        # si existe la palabra en el Excel...
  58.         delete $excel{ $registro->{palabra} };          # así que la borramos (ya la teníamos)
  59.     }
  60.     else {                                              # no existe: el usuario la ha borrado
  61.         push @palabras_borradas, $registro->{palabra};
  62.     }
  63. }
  64.  
  65. # en %excel quedarán las palabras nuevas que hay que meter en la base de datos
  66. print "Nuevos palabras a meter: ", join('/', keys %excel), "\n";
  67.  
  68. # y en @palabras_borradas, las que hay que quitar de la base de datos
  69. print "Palabras a borrar: ", join('/', @palabras_borradas), "\n";
  70.  
  71. __END__
  72. Nuevos palabras a meter: Jaime
  73. Palabras a borrar: Juan
Coloreado en 0.004 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

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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