• 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-08-12 08:21 @389

En el Excel lo único que no sé es en que columna están las palabras en inglés. Lo que sí se es que en la columna de la izquierda están sus traducciones.

Por ejemplo:

En la posición C4 está la primera palabra en inglés, con lo cual he encontrado la columna de las palabras en inglés. Con esto sé que en la columna B4 está la traducción al castellano de la palabra en inglés que está en la C4.

Espero haberme explicado bien. :D

Por cierto ¿cómo puedo coger el nombre de la hoja para mostrarlo en la línea 19?
Última edición por explorer el 2011-08-12 10:31 @480, editado 1 vez en total
Razón: se => sé, esta => está, ingles => inglés, si => sí, estan => están, como => ¿Cómo
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-08-12 10:39 @485

Bien, entonces la última parte queda así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.             if ($fila_enc and $col_enc) {
  2.                 print " Palabra en Castellano:  ", $BASE->[$hoja]->{cell}->[$col_enc-1]->[$fila_enc], ":\n";
  3.                 for my $col ($col_enc .. $maxcol) {
  4.                     my $celda = $BASE->[$hoja]->{cell}->[$col]->[$fila_enc];
  5.                     if (defined $celda) {
  6.                         printf "\t%s\n", $celda;
  7.                     }
  8.                 }
  9.             }
  10.             else {
  11.                 print "No hay traducción\n";
  12.             }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Para saber el nombre de la hoja, hay que saber que está en $BASE->[0]->{sheet}, pero en forma de hash, y además, al revés: los nombres de las hojas son las claves, y el número de hoja, el valor.

Así que hay que hacer un trabajo previo para darle la vuelta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     my %HOJAS = reverse %{$BASE->[0]->{sheet}};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Ahora, para sacar el nombre de la hoja $hoja vale con
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         print "Hoja ", $HOJA{$hoja}, "\n";
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: 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-08-12 11:05 @504

Creo que no me expliqué bien o no entiendo lo que hace:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ($fila_enc and $col_enc) {
  2.                 print " Palabra en Castellano:  ", $BASE->[$hoja]->{cell}->[$col_enc-1]->[$fila_enc], ":\n";
  3.                 for my $col ($col_enc .. $maxcol) {
  4.                     my $celda = $BASE->[$hoja]->{cell}->[$col]->[$fila_enc];
  5.                     if (defined $celda) {
  6.                         printf "\t%s\n", $celda;
  7.                     }
  8.                 }
  9.             }
  10.             else {
  11.                 print "No hay traducción\n";
  12.             }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Porque veo que recorre en el for() las columnas, pero yo sé que la traducción y la palabra en inglés están una pegada a la otra y la traducción siempre estará una columna a la izquierda de la palabra en inglés con lo cual creo que con el for() que hice valdría .

CÓDIGO:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!c:/perl/bin
  2.  
  3. use Spreadsheet::Read;                 # Módulos requeridos  por el programa.
  4. use autodie;
  5. use Data::Dumper;
  6.  
  7. my $BASE = ReadData( 'test.xlsx', cells => 0, attr => 1 );
  8.  
  9. die "ERROR: Base de datos no encontrada" if not $BASE;
  10.  
  11. my %HOJAS = reverse %{ $BASE->[0]->{sheet} };
  12.  
  13. my $sheets = $BASE->[0]->{sheets};     #Número de hojas.
  14.  
  15. my ( $fila_enc, $col_enc );
  16.  
  17. foreach my $hoja ( 1 .. $sheets ) {
  18.  
  19.     print "Hoja ", $HOJAS{$hoja}, "\n";
  20.  
  21.     my $maxrow = $BASE->[$hoja]->{maxrow};    # número máximo de filas que hay en la hoja
  22.     my $maxcol = $BASE->[$hoja]->{maxcol};    # número máximo de columnas que hay en la hoja
  23.     BUCLE:
  24.  
  25.     foreach my $fila ( 1 .. $maxrow ) {
  26.  
  27.         foreach my $columna ( 1 .. $maxcol ) {
  28.  
  29.             my $cell = $BASE->[$hoja]->{cell}->[$columna]->[$fila];  # accedemos a la celda correspondiente
  30.  
  31.             if ( defined $cell and $cell =~ m/^h/i ) {               # Mirar si la celda empieza por "h"
  32.                 $fila_enc = $fila;
  33.                 $col_enc  = $columna;
  34.                 last BUCLE;
  35.             }
  36.         }
  37.     }
  38.  
  39.     foreach my $fil ( $fila_enc .. $maxrow ) {
  40.  
  41.         # Hacer algo con el contenido de la celda $HOJA->[$columna]->[$fila]
  42.  
  43.         printf( " Palabra en Ingles:  %s\n", $BASE->[$hoja]->{cell}->[$col_enc]->[$fil], ":\n" );
  44.  
  45.         my $celda = $BASE->[$hoja]->{cell}->[ $col_enc - 1 ]->[$fil];
  46.  
  47.         if ( defined $celda ) {
  48.             printf( " Palabra en Castellano:  %s    ", $celda, ":\n" );
  49.         }
  50.         else {
  51.             print "No hay traducción\n";
  52.         }
  53.     }
  54. }
  55.  
Coloreado en 0.002 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-08-12 11:26 @518

Bueno, siempre puedes probarlo y averiguar cuál es la respuesta correcta.

El cómo sacar los valores depende de cómo están dispuestos (y cuántos sean) los contenidos que estén alrededor de la celda que empieza por la letra 'h'.
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-08-12 11:41 @528

Muchas 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-08-19 08:10 @382

Con esto ya creo que he terminado el programa. Pero tengo las últimas dudas:

CÓDIGO:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub  crearTabla ...
  2.    
  3. #Subrutina  insertar.
  4.  
  5. sub insertar ...
  6.  
  7. #Subrutina  comprobarDB.
  8.  
  9. sub comprobarDB ...
  10.  
  11.  
  12.     # Conectar base de datos y mirar si existe.
  13.    
  14.  
  15.     &comprobarDB();                    # Llamada a subrutina CompararDB.
  16.  
  17.     my($conexion,$sth);                     # Declaración de las  variables que utilizaremos a continuación.
  18.  
  19.     $conexion = ConectarDB->connect();      #  Conectamos con la  base de datos desde el paquete ConectarDB y lo dejamos en la variable $dbh.
  20.  
  21.     my $BASE = ReadData('test', cells => 0, attr => 1);
  22.  
  23.     die "ERROR: Base de datos no encontrada" if not $BASE;
  24.    
  25.     my %HOJAS = reverse %{$BASE->[0]->{sheet}};
  26.    
  27.     my $sheets = $BASE->[0]->{sheets};              #Número de hojas.
  28.    
  29.     my($fila_enc, $col_enc, $tabla);
  30.    
  31.     my %palabras_en_base_de_datos;
  32.  
  33.    
  34.     foreach my $hoja (1..$sheets){
  35.        
  36.        
  37.          print "Hoja ", $HOJAS{$hoja}, "\n";
  38.          
  39.          $tabla = $HOJAS{$hoja};
  40.        
  41.          $sth = $conexion->prepare("SELECT * FROM $tabla")or die("Couldn't prepare statement: " . $conexion->errstr);
  42.  
  43.          $sth->execute()or die("Couldn't execute statement: " . $sth->errstr);
  44.          
  45.          while (my $ref = $sth->fetchrow_hashref()) {
  46.                
  47.                $palabras_en_base_de_datos{$ref->{'palabra'}} = 1;    # Apuntamos la palabra en nuestro diccionario
  48.          }
  49.  
  50.          $sth->finish();
  51.        
  52.          &crearTabla($tabla, $conexion);
  53.          
  54.          
  55.          my $maxrow = $BASE->[$hoja]->{maxrow}; # número máximo de filas que hay en la hoja
  56.          my $maxcol = $BASE->[$hoja]->{maxcol}; # número máximo de columnas que hay en la hoja
  57.          BUCLE:
  58.        
  59.          foreach my $fila (1..$maxrow){
  60.            
  61.             foreach my $columna (1..$maxcol){
  62.                
  63.                 my $cell = $BASE->[$hoja]->{cell}->[$columna]->[$fila]; # accedemos a la celda correspondiente
  64.                
  65.                 if (defined $cell and $cell =~ m/^h/i) {    # Mirar si la celda empieza por "h"
  66.                    
  67.                     $fila_enc = $fila;
  68.                     $col_enc = $columna;
  69.                     last BUCLE;
  70.                 }
  71.             }
  72.          }
  73.        
  74.          my %palabras_en_excel;
  75.        
  76.          foreach my $fil($fila_enc..$maxrow) {
  77.         # Hacer algo con el contenido de la celda $HOJA->[$columna]->[$fila]
  78.        
  79.               my $celda = $BASE->[$hoja]->{cell}->[$col_enc]->[$fil];
  80.        
  81.               printf(" Palabra en Ingles:  %s\n",$celda);
  82.          
  83.               my $celda_ant = $BASE->[$hoja]->{cell}->[$col_enc-1]->[$fil];
  84.              
  85.               my $celda_opcional;
  86.              
  87.               if (defined $celda_ant){
  88.                
  89.                 printf(" Palabra en Castellano:  %s    ",$celda_ant);
  90.                
  91.                 $palabras_en_excel{$celda_ant} = 1;
  92.          
  93.                 $celda_opcional = $celda_ant;
  94.                
  95.               }else{
  96.                
  97.                  $palabras_en_excel{$celda_opcional} = 1;
  98.                          
  99.                  print "Opcional\n";
  100.                
  101.               }            
  102.                                
  103.          }
  104.          
  105.          #Encontrar palabras que insertar o que borrar.
  106.          
  107.        
  108.          my @palabras_borradas;               # aquí guardaremos las palabras a eliminar
  109.          
  110.          if (%palabras_en_base_de_datos){    #si ha cargado las palabras de la base de datos.
  111.                
  112.                 ## Recorremos la base de datos                                
  113.  
  114.                 for my $palabra (keys %palabras_en_base_de_datos) {
  115.  
  116.                         if (exists $palabras_en_excel{$palabra}) {# Si también existe la palabra en el Excel...
  117.                
  118.                                 delete $palabras_en_excel{$palabra};                    # la quitamos
  119.          
  120.                         }else {                                              # no existe: el usuario la ha borrado
  121.        
  122.                                 push @palabras_borradas, $palabra;                      # la guardamos para luego
  123.        
  124.                         }
  125.                 }
  126.                
  127.                
  128.          }else{
  129.                
  130.                 for my $palabra (keys %palabras_en_base_de_datos) {
  131.                        
  132.                         &insertar($palabra, ?¿?¿, $tabla, $conexion);      #Llamada a la subrutina insertar.Pasamos  el link, el nombre de la empresa, el nombre de la tabla y  la conexión.
  133.                        
  134.                 }
  135.                                
  136.          }
  137.          
  138.  
  139.          # En %palabras_en_excel quedarán las palabras nuevas que hay que meter en la base de datos
  140.          print "Nuevos palabras a meter: ", join('/', keys %palabras_en_excel), "\n";
  141.  
  142.          # Y en @palabras_borradas, las que hay que quitar de la base de datos
  143.          print "Palabras a borrar: ", join('/', @palabras_borradas), "\n";
  144.  
  145.     }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


PREGUNTAS:

*) Desde la linea 41 hasta la 50 lo que hago es cargar las palabras que hay en esa tabla pero ¿basta con "die" para hacer que en el caso de que no haya nada en la tabla esa no de error y siga ejecutando el código?

*) Tanto en la línea 91 como en la línea 97 necesito meter las dos palabras la de inglés y la de castellano. La de inglés es celda y la de castellano celda_ant. ¿Cómo hago para meter las dos palabras en la misma posición de la tabla hash?

*) En la línea 110 si la tabla hash no tiene valor haría el else{}, ¿no?

*) En la línea 132 le tengo que pasar las dos palabras tanto la de castellano como inglés pero ¿cómo cojo cada una de ellas ? Por eso pregunté lo de cómo meter las dos palabras en la misma posición; ahora de cómo sacar cada una.
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-08-19 11:48 @533

Podrías usar las claves para guardar las palabras en inglés, y los valores correspondientes, las de español:

$palabras_en_excel{$en_ingles} = $en_espanol;
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-08-22 10:36 @483

Sí, pero por ejemplo, tengo las dos palabras metidas ya en la tabla hash pero para pasarle las dos e introducirlas en la base de datos en la línea 132 ¿cómo las paso? ¿cómo sería esa línea?

Le quiero pasar la palabra en inglés, la palabra en castellano, el nombre de la tabla y la conexión:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. &insertar($palabra, ?¿?¿, $tabla, $conexion);
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-08-22 10:50 @493

A ver si te lo explico con sencillez...

Tu has guardado las palabras, las de inglés y las de español, ambas como claves de un hash, pero sin conexión entre ellas. Es decir: has creado dos entradas independientes dentro del hash.

Lo que tienes que hacer es guardar una relación entre ellas.

Por eso te he dicho, que en la línea 91, en lugar de guardar un mísero '1' como valor del elemento hash, guardes la palabra en español:

$palabras_en_excel{$celda} = $celda_ant;

De esa manera, estás creando un elemento hash que tiene como clave a la palabra en inglés, y como valor, la palabra en español.

A la hora de acceder a esta información, en la línea 130 estás recorriendo las claves del hash, que son las palabras en inglés. Bueno, pues si $palabra es la palabra en inglés, con $palabras_en_excel{$palabra} obtienes la palabra en español.
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-08-23 10:55 @496

He creado una subrutina para la hora de cargar los datos de base de datos. Para devolver la tabla hash ¿sería así? ¿Y recibirla en otra tabla hash, no?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub datosBaseDatos {
  2.        
  3.         my ($sth,$conexion,$tabla);
  4.         my %palabras_en_base_de_datos;
  5.        
  6.        
  7.         $sth = $conexion->prepare("SELECT * FROM $tabla")or die("Couldn't prepare statement: " . $conexion->errstr);
  8.  
  9.         $sth->execute()or die("Couldn't execute statement: " . $sth->errstr);
  10.          
  11.         while (my $ref = $sth->fetchrow_hashref()) {
  12.                
  13.                $palabras_en_base_de_datos{$ref->{'palabra'}} = 1;    # Apuntamos la palabra en nuestro diccionario
  14.         }
  15.  
  16.         $sth->finish();
  17.        
  18.         return %palabras_en_base_de_datos;
  19. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Otra cosa que no me reconoce a la hora de leer el archivo. Si no pongo la extensión no lo reconoce. Si no pongo .xlsx no lo reconoce. ¿Está bien eso? Porque si el archivo en vez de ser .xlsx es .xls ¿?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $BASE = ReadData('test.xlsx', cells => 0, attr => 1);
  2.  
  3.     die "ERROR: Base de datos no encontrada" if not $BASE;
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

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