• 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 explorer » 2011-06-01 13:25 @601

El error indica que $celda1->{Val} no está definido.

Sí, $dbh contendrá el valor "undef".

La forma de comprobar si un valor está definido o no, es con defined():

if (defined $dhb) {
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

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

Notapor Txemaracas » 2011-06-02 07:32 @356

Hola, explorer. He introducido en mi código la línea que me has puesto en el post anterior y me dice lo siguiente:

DBI connect('host=localhost;database='abrir'...) failed:Unknown database 'abrir' a ConectarDB.pm line 25.

La línea 25 es donde le paso el usuario el pasword y la base de datos a usar, en este caso, "abrir".

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use DBI;
  2. use ConectarDB;
  3.  
  4. my($dbh,$sth);
  5.  
  6. $dbh = ConectarDB->connect();
  7.  
  8. sub crear {
  9.  
  10.         $dbh->do("CREATE DATABASE abrir");
  11.  
  12.         $dbh->do("USE abrir");
  13.  
  14.         $dbh->do("CREATE TABLE palabras (palabra VARCHAR(30), id integer)");
  15.  
  16.  
  17. }
  18.  
  19.  
  20.  
  21. if (defined $dbh) {
  22.  
  23.     eval { $dbh->do("DROP DATABASE abrir") };
  24.  
  25.     print "Dropping foo failed: $@\n" if $@;
  26.  
  27.  
  28.         &crear();
  29. }else{
  30.  
  31.         &crear();
  32.  
  33. }
  34.  
  35.  
  36. $dbh->disconnect;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Lo que se supone que debe hacer es que si está definida la base de datos la elimine y la vuelva a crear con los nuevos datos y si no está definida que la cree. Pero el problema es que como no está creada la base de datos "abrir", al principio, me da ese error.


Otra pregunta: el caso es que la persona que lo va a utilizar tendrá un archivo Excel que es el que cargará en la base de datos pero cuando haya una palabra nueva la escribirá en el Excel y lo actualizará en la base de datos. En tu opinión ¿qué sería mejor, eliminar todo y volver a crearlo con los nuevos datos o ir comparando lo que hay en la base de datos con lo que contiene el archivo Excel y añadir las nuevas palabras? La pega que le veo al último caso es que en el caso de que el usuario elimine del archivo Excel alguna palabra que no quiera usar más, esa seguirá estando en la base de datos, ¿no? porque solo añade las nuevas palabras que encuentre en el Excel. No sé si me expliqué bien.
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-02 07:47 @366

Yo nunca haría un DROP y un CREATE de una base de datos... es un proceso muy costoso para el motor de base de datos.

Lo que haría sería crear la base de datos, antes de nada, y luego, dentro del programa, en las tareas diarias, actualizar sus contenidos.

El error que te sale es, justamente, porque la base de datos no existe. Para capturar el error puedes usar eval(). Pero ya digo que esto no sería necesario si consideramos que la base de datos siempre a de estar presente.

Ahora bien... dices que el usuario está usando una hoja Excel... ¿por qué no usas la propia hoja Excel como base de datos? Puedes abrirla, leer las celdas... Te ahorras todo el proceso de transformarlo a base de datos. En cuanto el usuario actualice la hoja, y la suba al servidor, los cambios son instantáneos.

Yo suelo mucho esta solución, hoy en día, ya que a muchos usuarios les resulta muy sencillo el uso de la hoja, en lugar de lidiar con un formulario de base de datos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
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-02 08:04 @378

¡Buf!, entonces mejor no hacer el drop y el create, eso me quedó claro. Lo que más difícil me resulta es lo que dices de usar la hoja Excel como base de datos. ¿Lo que me intentas decir es que no almacene nada en base de datos? ¿Simplemente que cargue todos los días, o cada vez que abra el programa, la hoja de Excel? ¿Me podrías poner un pequeño ejemplo si no es mucho pedir, por favor?

Gracias.
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-02 09:26 @434

En estos foros hay algunos hilos al respecto de usar Excel como una base de datos, o simplemente, abrirlo, desde un programa Perl. Usa el sistema de búsqueda, busca por Excel.

Era solo un consejo. Desde Perl se puede tener acceso al contenido de la hoja, por lo que entonces... ya tenemos hecha la base de datos, que el usuario actualiza cada vez que la cambia.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
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-02 10:08 @464

¿Te refieres a este código que pusiste tu en un post?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.   my $BASE = ReadData($FICHERO_BASE, cells => 0, attr => 1);
  2.     die "ERROR: Base de datos no encontrada" if not $BASE;
  3.      
  4.     my %HOJAS = %{$BASE->[0]->{sheet}};             # Relación hojas -> índices
  5.      
  6.     my $HOJA = $BASE->[ $HOJAS{$sector} ]->{cell};  # Referencia a la hoja $sector
  7.      
  8.     for (my $fila = 1; $HOJA->[$columna]->[$fila]; $fila++) {
  9.         # Hacer algo con el contenido de la celda $HOJA->[$columna]->[$fila]
  10.     }
  11.  
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-06-02 13:31 @605

Esta es una forma, sí, pero hay más.

Desde luego, con Spreadsheet::Read se puede acceder de forma cómoda al contenido de las hojas.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
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-02 16:19 @721

Ya, pero la verdad que llevo mirándome la documentación de Spreadsheet::Read bastante tiempo pero no saco tampoco mucho. Tu como eres más experimentado y sabes más de estos temas por eso te pedía consulta, pero muchas gracias, seguiré intentado y sino como último recurso, como tampoco tengo mucho tiempo para hacerlo, haré lo de drop y create que aunque sea poco eficiente al menos funcionará, je,je.

Gracias, explorer.
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 Txemaracas » 2011-06-03 09:34 @440

Hola explorer. No quiero parecer pesado pero no consigo hacer que me capture cuando intenta conectar a la base de datos y no existe. Así la puedo crear después. No sé si uso bien eval() pero ¿podridas decirme cómo hacerlo para que me la creé cuando no existe?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. eval  {$dbh = ConectarDB->connect()};
  2.  
  3. print "No se ha  podido  conectar. Proceder a crearlo: $@\n" if $@;
  4.  
  5. &crear();
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-06-03 16:36 @733

Yo veo que el código está bien, excepto que siempre estás creando la base de datos (siempre llegas a crear()).

Sería algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $dbh;
  2.  
  3. eval  {
  4.     $dbh = ConectarDB->connect()
  5. };
  6.  
  7. if ($@) {
  8.     print "No se ha  podido  conectar. Proceder a crearlo: $@\n" if ;
  9.      
  10.     &crear();
  11.  
  12.     # obtener aquí el $dbh a la nueva base de datos
  13. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Aquí te pongo otra forma de crear la base de datos. Leyendo la documentación de DBD::mysql, resulta que se puede hacer de otras maneras:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use Modern::Perl;       # somos modernos
  3. use utf8;               # este programa está escrito en utf8
  4. use autodie;            # es mejor morir que regresar con deshonor (proverbio Klingon)
  5.  
  6. use DBI;
  7.  
  8. ## Sacamos la lista de bases de datos presentes en el sistema
  9. ## La indicación de usuario y contraseña es vital, para que MySQL nos muestre las bases de datos según
  10. ## quién seamos (no todos los usuarios tienen acceso a todas las bases de datos)
  11. my @databases = DBI->data_sources("mysql", {host => 'localhost', user => 'root', password => ''});
  12.  
  13. say "@databases";                                       # muestra bases de datos actuales
  14.  
  15. my $base_datos = 'nuestra_base_de_datos';               # esta es la que vamos a crear
  16.  
  17. my $dsn = "DBI:mysql:$base_datos";                      # conformamos el DSN de esa base de datos
  18.  
  19. unless ($dsn ~~ @databases) {                           # si el $dsn no está entre las @databases...
  20.  
  21.     my $drh = DBI->install_driver("mysql");             # Carga del controlador mysql
  22.  
  23.                                                         # Creamos la base de datos
  24.     my $rc = $drh->func("createdb", $base_datos, 'localhost', 'root', '', 'admin');
  25.  
  26.     say "[$rc]";                                        # '1' si todo ha ido bien. '' si no.
  27. }
  28. else {
  29.     say "La base de datos $base_datos ya está creada";
  30. }
  31.  
  32. ## Sacamos de nuevo la lista de bases de datos, para comprobar que se ha creado bien (o que ya existía)
  33. @databases = DBI->data_sources("mysql", {host => 'localhost', user => 'root', password => ''});
  34.  
  35. say "@databases";
  36. __END__
  37. DBI:mysql:information_schema DBI:mysql:mysql DBI:mysql:test
  38. [1]
  39. DBI:mysql:information_schema DBI:mysql:mysql DBI:mysql:nuestra_base_de_datos DBI:mysql:test
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Aquí ves cómo se puede crear una base de datos, hablando directamente con el motor MySQL. También, de la misma manera, puedes destruir una base de datos, cambiando "createdb" por "dropdb".

Hay otra tercera forma que he encontrado. En MySQL se pueden usar las instrucciones "CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name" y "DROP {DATABASE | SCHEMA} [IF EXISTS] db_name".
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
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 1 invitado

cron