Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Otros Temas » Bases de Datos » Importar Excel a base de datos usando un archivo ".tabs"  RESUELTO Responder al tema
Nuevo tema


Página 2 de 2  [ 21 mensajes ]  Ir a página Anterior  1, 2
 
Nota 2011-06-11 09:12 @425

Perlero Frecuente
Registrado: 2009-12-10 11:20 @514
Mensajes: 124
Re: Importar Excel a base de datos usando un archivo ".tabs"
¡Muchísimas gracias, explorer!
Esta noche mismo me pongo a convertir el Excel a SQL y te cuento cómo me ha ido (con el formato tabs y con el csv (haciendo los cambios que me has recomendado).
¡Eres un fenómeno!


Nota 2011-06-12 07:01 @334

Perlero Frecuente
Registrado: 2009-12-10 11:20 @514
Mensajes: 124
Re: Importar Excel a base de datos usando un archivo ".tabs"
Hola, explorer,

He unido tu script al programa principal pero el intérprete de Perl me da error en la sintaxis de SQL cuando lo ejecuto...

Aquí te pongo las modificaciones:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!c:/perl/bin/perl.exe
  2. use warnings;
  3. use strict;
  4. #use Modern::Perl;      # somos modernos
  5. #use utf8;              # este programa está escrito en utf8
  6. use autodie;            # es mejor morir que regresar con deshonor (proverbio Klingon)
  7.  
  8. #Leo fichero para trabajar
  9.  
  10. @ARGV == 1 or die "Uso: $0 <fichero tabs>\n";
  11. my $fichero = shift;
  12. print "$fichero";
  13.  
  14. ############################################################
  15. # Conectamos a la base de datos de MySQL
  16.  
  17. use DBI;
  18. my $database = 'fungo';
  19. my $server = 'localhost';
  20. my $user = 'root';
  21. my $passwd = 'password';
  22.  
  23. my $homologs = DBI->connect("dbi:mysql:$database:$server", $user, $passwd);
  24. my $sqlinit = $homologs->prepare("show tables");
  25. $sqlinit->execute();
  26. while (my $row = $sqlinit->fetchrow_arrayref) {
  27.         print join("\t", @$row), "\n";
  28. }
  29. #################################codigo de explorer################################################
  30.  
  31. my $table;
  32. my $numero_campos;
  33. my @campos;
  34.  
  35. open my $TABS, '<', $fichero;
  36.  
  37. while (my $linea = <$TABS>) {
  38.  
  39.     next if $linea =~ m/^\s*$/;         # líneas vacías, las saltamos
  40.  
  41.     chomp $linea;                       # quitamos carácter fin de línea
  42.  
  43.     if ($linea =~ m/TABLE\s+(\w+)/) {   # si es comienzo de definición de tabla
  44.         $table = $1;                    # guardamos su nombre
  45.  
  46.         print "DELETE FROM $table\n";
  47.                
  48.         # Borramos las filas de la tabla
  49.  
  50.         my $droprows = $homologs->prepare("DELETE FROM $table");
  51.         $droprows->execute();
  52.                
  53.                
  54.         $linea = <$TABS>;               # leemos las cabeceras
  55.          
  56.         $numero_campos = @campos = split " ", $linea;
  57.  
  58.         print "INSERT INTO $table (", join(',' , @campos), ') values (', join(',' , ('?') x $numero_campos), ")\n";
  59.                
  60.         #Insertamos los campos
  61.  
  62.         my $query = "INSERT INTO $table (", join(',', @campos) .") values ("." join(',' , ('?') x $numero_campos)"."?)";
  63.         my $sql = $homologs->prepare($query);
  64.         $sql->execute();
  65.         next;
  66.     }
  67.            
  68.     my @valores = split " ", $linea;    # todas las demás líneas serán valores a introducir
  69.  
  70.     if ($numero_campos == @valores) {   # comprobación de que hemos leído correctamente el número de campos
  71.         print "INSERT INTO $table (" , join(',' , @campos), ') values (', join(',' , map { qq('$_') } @valores), ")\n";
  72.        
  73.         #Insertamos los valores
  74.  
  75.         my $lquery = "INSERT INTO $table (" , join(',' , @campos) .") values ("."join(',' , @valores)".")";
  76.         my $sqlinea = $homologs->prepare($lquery);
  77.         $sqlinea->execute();  
  78.    }
  79.     else {
  80.         die "Error en línea $.\n";      # si no es así, avisamos y terminamos
  81.     }
  82. }
  83.  
  84. close $TABS;
  85. ###################################fin codigo explorer##########################################
  86.  
  87. # Break connection with MySQL database
  88.  
  89. $homologs->disconnect;
  90.  
  91. exit;



Concretamente me da este error:

Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
c:\Perlprograms>ESQL.pl HML.tabs
HML.tabs
genomes
homologs
prueba
DELETE FROM homologs
INSERT INTO homologs (OrgId,Organism) values (?,?)
DBD::mysql::st execute failed: You have an error in your SQL syntax; check the m
anual that corresponds to your MySQL server version for the right syntax to use
near '' at line 1 at C:\Perlprograms\ESQL.pl line 61, <$_[...]> line 2.
INSERT INTO homologs (OrgId,Organism) values ('PPL','human')
DBD::mysql::st execute failed: You have an error in your SQL syntax; check the m
anual that corresponds to your MySQL server version for the right syntax to use
near '' at line 1 at C:\Perlprograms\ESQL.pl line 73, <$_[...]> line 3.
INSERT INTO homologs (OrgId,Organism) values ('POS','worm')
DBD::mysql::st execute failed: You have an error in your SQL syntax; check the m
anual that corresponds to your MySQL server version for the right syntax to use
near '' at line 1 at C:\Perlprograms\ESQL.pl line 73, <$_[...]> line 4.
INSERT INTO homologs (OrgId,Organism) values ('LBI','mouse')
DBD::mysql::st execute failed: You have an error in your SQL syntax; check the m
anual that corresponds to your MySQL server version for the right syntax to use
near '' at line 1 at C:\Perlprograms\ESQL.pl line 73, <$_[...]> line 5.


Nota 2011-06-12 16:12 @716
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10261
Re: Importar Excel a base de datos usando un archivo ".tabs"
He encontrado lo siguiente:

* línea 62:
my $query = "INSERT INTO $table (", join(',', @campos) .") values ("." join(',' , ('?') x $numero_campos)"."?)";

El problema es que estás usando las comas para unir expresiones. Debes usar el operador concatenación '.'. Y además, hay un carácter '?' demás:

my $query = "INSERT INTO $table (" . join(',', @campos) . ') values (' . join(',' , ('?') x $numero_campos) . ')';

* línea 64: no hay que hacer ningún execute(): no estás insertando ningún valor.

* línea 75. Pasa lo mismo. La línea correcta es:

my $lquery = "INSERT INTO $table (" . join(',' , @campos) .') values (' . join(',' , @valores) . ')';

* realmente... las líneas 75 y 76 sobran... no es necesario hacer un prepare(), porque ya lo has hecho en la línea 64. Entonces... deberías hacer la variable $sql de la línea 63 global (mover el my $sql; fuera del bucle y dejar la línea 63 como $sql = $homologs->prepare($query); ) Quitas las líneas 75 y 76, y cambias la 77, la variable $sqlinea por $sql.

_________________
JF^D Perl programming


Nota 2011-06-13 04:44 @238

Perlero Frecuente
Registrado: 2009-12-10 11:20 @514
Mensajes: 124
Re: Importar Excel a base de datos usando un archivo ".tabs"
Hola de nuevo, explorer,

He hecho las modificaciones que me comentaste y el programa aparenta no tener errores, pero al correrlo, me vacía la tabla de la base de datos de SQL, pero da error de sintaxis a la hora de introducir los valores, con lo cual deja la tabla vacía...

Te vuelvo a poner el código aquí por si puedes ver dónde he metido la pata esta vez.

Este cambio no lo he hecho porque me daba muchos errores al intentarlo
Citar:
deberías hacer la variable $sql de la línea 63 global (mover el my $sql; fuera del bucle y dejar la línea 63 como $sql = $homologs->prepare($query); )

y por eso he dejado las dos órdenes (líneas 62 y 75).

Aquí te dejo el código:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1.     #!c:/perl/bin/perl.exe
  2.     use warnings;
  3.     use strict;
  4.     #use Modern::Perl;      # somos modernos
  5.     #use utf8;              # este programa está escrito en utf8
  6.     use autodie;            # es mejor morir que regresar con deshonor (proverbio Klingon)
  7.      
  8.     #Leo fichero para trabajar
  9.      
  10.     @ARGV == 1 or die "Uso: $0 <fichero tabs>\n";
  11.     my $fichero = shift;
  12.     print "$fichero\n";
  13.      
  14.     ############################################################
  15.     # Conectamos a la base de datos de MySQL
  16.      
  17.     use DBI;
  18.     my $database = 'fungo';
  19.     my $server = 'localhost';
  20.     my $user = 'root';
  21.     my $passwd = 'password';
  22.      
  23.     my $homologs = DBI->connect("dbi:mysql:$database:$server", $user, $passwd);
  24.     my $sqlinit = $homologs->prepare("show tables");
  25.     $sqlinit->execute();
  26.     while (my $row = $sqlinit->fetchrow_arrayref) {
  27.             print join("\t", @$row), "\n";
  28.     }
  29.     #################################codigo de explorer################################################
  30.      
  31.     my $table;
  32.     my $numero_campos;
  33.     my @campos;
  34.    
  35.     open my $TABS, '<', $fichero;
  36.      
  37.     while (my $linea = <$TABS>) {
  38.      
  39.         next if $linea =~ m/^\s*$/;         # líneas vacías, las saltamos
  40.      
  41.         chomp $linea;                       # quitamos carácter fin de línea
  42.      
  43.         if ($linea =~ m/TABLE\s+(\w+)/) {   # si es comienzo de definición de tabla
  44.             $table = $1;                    # guardamos su nombre
  45.      
  46.             print "DELETE FROM $table\n";
  47.                    
  48.             # Borramos las filas de la tabla
  49.      
  50.             my $droprows = $homologs->prepare("DELETE FROM $table");
  51.             $droprows->execute();
  52.                    
  53.                    
  54.             $linea = <$TABS>;               # leemos las cabeceras
  55.              
  56.             $numero_campos = @campos = split " ", $linea;
  57.      
  58.             print "INSERT INTO $table ( ", join(' , ' , @campos), ' ) values ( ', join(' , ' , ('?') x $numero_campos), " )\n";
  59.                    
  60.             #Insertamos los campos
  61.      
  62.             my $query = "INSERT INTO $table ( " . join(' , ', @campos) . ' ) values ( ' . join(' , ' , ('?') x $numero_campos) . ' )';
  63.             my $sql = $homologs->prepare($query);
  64.              
  65.             next;
  66.         }
  67.                
  68.         my @valores = split " ", $linea;    # todas las demás líneas serán valores a introducir
  69.      
  70.         if ($numero_campos == @valores) {   # comprobación de que hemos leído correctamente el número de campos
  71.             print "INSERT INTO $table ( " , join(' , ' , @campos), ' ) values ( ', join(' , ' , map { qq('$_') } @valores), " )\n";
  72.            
  73.             #Insertamos los valores
  74.      
  75.             my $query = "INSERT INTO $table ( " . join(' , ' , @campos) .' ) values ( ' . join(' , ' , @valores) . ' )';  
  76.             my $sql = $homologs->prepare($query);  
  77.             $sql->execute();  
  78.        }
  79.         else {
  80.             die "Error en línea $.\n";      # si no es así, avisamos y terminamos
  81.         }
  82.     }
  83.      
  84.     close $TABS;
  85.     ###################################fin codigo explorer##########################################
  86.      
  87.     # Break connection with MySQL database
  88.      
  89.     $homologs->disconnect;
  90.      
  91.     exit;


Y aquí el error de sintaxis que me da:

Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
c:\Perlprograms>ex.pl hml.tabs
hml.tabs
genomes
homologs
prueba
DELETE FROM homologs
INSERT INTO homologs ( OrgId , Organism ) values ( ? , ? )
INSERT INTO homologs ( OrgId , Organism ) values ( 'PPL' , 'human' )
DBD::mysql::st execute failed: Unknown column 'PPL' in 'field list' at C:\Perlpr
ograms\EX.pl line 77, <$_[...]> line 3.
INSERT INTO homologs ( OrgId , Organism ) values ( 'POS' , 'worm' )
DBD::mysql::st execute failed: Unknown column 'POS' in 'field list' at C:\Perlpr
ograms\EX.pl line 77, <$_[...]> line 4.
INSERT INTO homologs ( OrgId , Organism ) values ( 'LBI' , 'mouse' )
DBD::mysql::st execute failed: Unknown column 'LBI' in 'field list' at C:\Perlpr
ograms\EX.pl line 77, <$_[...]> line 5.
 


Muchas gracias por tu atención y tu ayuda explorer.


Nota 2011-06-13 09:23 @433
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10261
Re: Importar Excel a base de datos usando un archivo ".tabs"
Disculpas. Parece que no te lo he explicado bien. Prueba con esto (no probado):

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!c:/perl/bin/perl.exe
  2. use warnings;
  3. use strict;
  4. #use Modern::Perl;      # somos modernos
  5. #use utf8;              # este programa está escrito en utf8
  6. use autodie;            # es mejor morir que regresar con deshonor (proverbio Klingon)
  7.  
  8. use DBI;
  9.  
  10. # Leo fichero para trabajar
  11. @ARGV == 1 or die "Uso: $0 <fichero tabs>\n";
  12. my $fichero = shift;
  13. print "[$fichero]\n";
  14.  
  15. # Conectamos a la base de datos de MySQL
  16. my $database = 'fungo';
  17. my $server   = 'localhost';
  18. my $user     = 'root';
  19. my $passwd   = 'password';
  20.  
  21. my $homologs = DBI->connect("dbi:mysql:$database:$server", $user, $passwd);
  22.  
  23.  
  24. # Lista de las tablas disponibles en la base de datos
  25. my $sqlinit  = $homologs->prepare("show tables");
  26. $sqlinit->execute();
  27. while (my $row = $sqlinit->fetchrow_arrayref) {
  28.     print join("\t", @$row), "\n";
  29. }
  30.  
  31. # Lectura del fichero tabs
  32. my $sql;
  33. my $sth;
  34. my $table;
  35. my @campos;
  36. my $numero_campos;
  37.  
  38. open my $TABS, '<', $fichero;
  39.  
  40. while (my $linea = <$TABS>) {
  41.  
  42.     next if $linea =~ m/^\s*$/;         # líneas vacías, las saltamos
  43.  
  44.     chomp $linea;                       # quitamos carácter fin de línea
  45.  
  46.     if ($linea =~ m/TABLE\s+(\w+)/) {   # si es comienzo de definición de tabla
  47.         $table = $1;                    # guardamos su nombre
  48.  
  49.         $sql = "DELETE FROM $table";    # Borramos las filas de la tabla
  50.         $homologs->do($sql);
  51.         print "$sql\n";
  52.                
  53.         $linea = <$TABS>;               # leemos las cabeceras
  54.         $numero_campos = @campos = split " ", $linea;
  55.  
  56.                                         # preparamos la instrucción de inserción
  57.         $sql = "INSERT INTO $table ( "
  58.              . join(',', @campos)
  59.              . ' ) values ( '
  60.              . join(',' , ('?') x $numero_campos)
  61.              . ' )'
  62.              ;
  63.         $sth = $homologs->prepare($sql);
  64.         print "$sql\n";
  65.          
  66.         next;                           # saltamos a siguiente línea
  67.     }
  68.            
  69.     my @valores = split " ", $linea;    # todas las demás líneas serán valores a introducir
  70.  
  71.     if ($numero_campos == @valores) {   # comprobación de que hemos leído correctamente el número de campos
  72.         $sth->execute(@valores);        # insertamos los valores
  73.         print "Insertando [@valores]\n";
  74.    }
  75.     else {
  76.         die "Error en línea $.\n";      # si no es así, avisamos y terminamos
  77.     }
  78. }
  79.  
  80. close $TABS;
  81.  
  82. # Break connection with MySQL database
  83. $homologs->disconnect;
  84.  
  85. __END__

_________________
JF^D Perl programming


Nota 2011-06-13 09:34 @440

Perlero Frecuente
Registrado: 2009-12-10 11:20 @514
Mensajes: 124
Re: Importar Excel a base de datos usando un archivo ".tabs"  RESUELTO
Muchísimas gracias, explorer, parece que ahora sí que funciona.

Espero ser capaz de crear la base de datos SQL (la de tamaño grande) usando este programa y los conocimientos que me has facilitado al contestar a mis dudas.

Un saludo con mi más sincero agradecimiento.


Responder al tema  [ 21 mensajes ]  Ir a página Anterior  1, 2

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO