• Publicidad

Importar Excel a base de datos usando un archivo ".tabs"

Todo acerca de las bases de datos que existen: SQL, MySQL, Oracle, Postgres, CSV, etc.

Re: Importar Excel a base de datos usando un archivo ".tabs"

Notapor explorer » 2011-06-09 08:19 @388

En efecto. El programa trabaja bajo la idea de que tienes una base de datos con unas tablas cuyos nombres coinciden con los que aparecen en el fichero .tabs. Y las tablas tienen definidas una serie de campos que son los mismos y con los mismos nombres que los que tiene el fichero .tabs.

Si todo eso existe, el programa limpiará la tabla en cuanto llegue a la primera línea TABLE. Y luego empezará a hacer INSERT con el resto de las líneas.
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: Importar Excel a base de datos usando un archivo ".tabs"

Notapor Alfumao » 2011-06-09 08:29 @395

La cosa es, si a la tabla del fichero tabs, le agrego una línea nueva y luego intento cargarla con el programa en la base de datos, ¿funcionará aunque esa línea no estuviera en la tabla original?
¿podría agregar una columna más al fichero tabs de las que presenta la tabla original (sita en la base de datos) y me seguiría funcionando el procedimiento?
El problema que tengo que resolver es el de obtener un programa que me permita reemplazar la tabla preexistente por sus actualizaciones (ya que la tabla se irá actualizando con el tiempo al írsele agregando nuevas filas o columnas).
Se que soy un negado con la informática, pero la ayuda que obtengo de este foro es la única con la que puedo contar.

Gracias de nuevo por tu atención explorer.
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Re: Importar Excel a base de datos usando un archivo ".tabs"

Notapor explorer » 2011-06-09 16:59 @749

Alfumao escribiste:La cosa es, si a la tabla del fichero tabs, le agrego una línea nueva y luego intento cargarla con el programa en la base de datos, ¿funcionará aunque esa línea no estuviera en la tabla original?
Sí, si la línea tiene el mismo número de campos y están separados por el mismo tipo de delimitadores (espacios en blanco, tabuladores).

Alfumao escribiste:¿podría agregar una columna más al fichero tabs de las que presenta la tabla original (sita en la base de datos) y me seguiría funcionando el procedimiento?
Sí, si cambias la definición de la tabla en la base de datos, agregando ese nuevo campo.

Alfumao escribiste:El problema que tengo que resolver es el de obtener un programa que me permita reemplazar la tabla preexistente por sus actualizaciones (ya que la tabla se irá actualizando con el tiempo al írsele agregando nuevas filas o columnas).
No hay problemas en agregar filas. Pero sí las columnas, como te acabo de decir.

Alfumao escribiste:Se que soy un negado con la informática, pero la ayuda que obtengo de este foro es la única con la que puedo contar.
¡Ánimo! :D
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: Importar Excel a base de datos usando un archivo ".tabs"

Notapor Alfumao » 2011-06-11 03:08 @172

Hola de nuevo,

He creado manualmente una tabla pequeña en MySQL para comprobar que puedo hacer funcionar el programa:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
TABLE   HOMOLOGS
OrgId   Organism
PPL     human
POS     worm
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Y he intentado, con el programa, que cargue una versión de la tabla con el mismo nombre pero con una línea más, la siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
LBI     mouse
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Pero parece que el script se queda atascado en la primera llamada a SQL y se para una vez que me muestra las tablas presentes en la base de datos... Creo que el problema puede estar en el formato tabs, que me está trayendo de cabeza para manipularlo.

¿Sería una buena solución elegir otro formato que se pueda obtener del Excel?

Creo que quizá con un formato más "fácil de entender" es decir, más claro a la hora de leerlo, como csv podrían obtener archivos estandar mas intuitivos de leer (por mí) y modificar más fácil y rápido, en caso de tener que cambiar un valor "a mano"...

¿Qué opinas, explorer?

¿Habría que hacerle muchos cambios al programa que mandé al principio?

Muchas gracias por tus respuestas ;)
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Re: Importar Excel a base de datos usando un archivo ".tabs"

Notapor explorer » 2011-06-11 07:29 @353

He hecho un ejemplo, para que veas que es tanto o más sencillo que con el formato CVS.

Supongamos este archivo tabs (valores separados por tabuladores):
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
TABLE   ORGANISM
OrgId   Organism
1       human
2       worm
3       mouse

TABLE   GENES
GeneId  Gene    Date
118     aging   1984-07-13
9223    wrinkle 1987-08-15
273     hairy   1990-09-30

TABLE   VARIANTS
VarId   OrgId   GeneId
1       1       118
2       2       118
3       1       9223
4       3       9223
5       3       273
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Entonces, con este programa:
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. @ARGV == 1 or die "Uso: $0 <fichero tabs>\n";
  7.  
  8. my $fichero = shift;
  9.  
  10. my $table;
  11. my $numero_campos;
  12. my @campos;
  13.  
  14. open my $TABS, '<', $fichero;
  15.  
  16. while (my $linea = <$TABS>) {
  17.  
  18.     next if $linea =~ m/^\s*$/;         # líneas vacías, las saltamos
  19.  
  20.     chomp $linea;                       # quitamos carácter fin de línea
  21.  
  22.     if ($linea =~ m/TABLE\s+(\w+)/) {   # si es comienzo de definición de tabla
  23.         $table = $1;                    # guardamos su nombre
  24.  
  25.         print "DELETE FROM $table\n";
  26.  
  27.         $linea = <$TABS>;               # leemos las cabeceras
  28.          
  29.         $numero_campos = @campos = split " ", $linea;
  30.  
  31.         print "INSERT INTO $table (" , join(',', @campos), ') values (', join(',', ('?') x $numero_campos), ")\n";
  32.         next;
  33.     }
  34.  
  35.     my @valores = split " ", $linea;    # todas las demás líneas serán valores a introducir
  36.  
  37.     if ($numero_campos == @valores) {   # comprobación de que hemos leído correctamente el número de campos
  38.         print "INSERT INTO $table (" , join(',', @campos), ') values (', join(',', map { qq('$_') } @valores), ")\n";
  39.     }
  40.     else {
  41.         die "Error en línea $.\n";      # si no es así, avisamos y terminamos
  42.     }
  43. }
  44.  
  45. close $TABS;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

sale
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
DELETE FROM ORGANISM
INSERT INTO ORGANISM (OrgId,Organism) values (?,?)
INSERT INTO ORGANISM (OrgId,Organism) values ('1','human')
INSERT INTO ORGANISM (OrgId,Organism) values ('2','worm')
INSERT INTO ORGANISM (OrgId,Organism) values ('3','mouse')
DELETE FROM GENES
INSERT INTO GENES (GeneId,Gene,Date) values (?,?,?)
INSERT INTO GENES (GeneId,Gene,Date) values ('118','aging','1984-07-13')
INSERT INTO GENES (GeneId,Gene,Date) values ('9223','wrinkle','1987-08-15')
INSERT INTO GENES (GeneId,Gene,Date) values ('273','hairy','1990-09-30')
DELETE FROM VARIANTS
INSERT INTO VARIANTS (VarId,OrgId,GeneId) values (?,?,?)
INSERT INTO VARIANTS (VarId,OrgId,GeneId) values ('1','1','118')
INSERT INTO VARIANTS (VarId,OrgId,GeneId) values ('2','2','118')
INSERT INTO VARIANTS (VarId,OrgId,GeneId) values ('3','1','9223')
INSERT INTO VARIANTS (VarId,OrgId,GeneId) values ('4','3','9223')
INSERT INTO VARIANTS (VarId,OrgId,GeneId) values ('5','3','273')
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

La diferencia con un fichero CVS es que el delimitador, en lugar de ser un tabulador o espacios, es una ','. Solo tendrías que cambiar, en las instrucciones split(), el " ", por un "," y ya tienes un programa que lee ficheros CVS.

El problema está en otro sitio. Puedes usar el truco que te muestro (pintar las instrucciones SQL) para ver qué comandos le estás enviando al MySQL.
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: Importar Excel a base de datos usando un archivo ".tabs"

Notapor Alfumao » 2011-06-11 09:12 @425

¡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!
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Re: Importar Excel a base de datos usando un archivo ".tabs"

Notapor Alfumao » 2011-06-12 07:01 @334

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:

Sintáxis: [ Descargar ] [ Ocultar ]
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;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4



Concretamente me da este error:

Sintáxis: [ Descargar ] [ Ocultar ]
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.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Re: Importar Excel a base de datos usando un archivo ".tabs"

Notapor explorer » 2011-06-12 16:12 @716

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 & 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: Importar Excel a base de datos usando un archivo ".tabs"

Notapor Alfumao » 2011-06-13 04:44 @238

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
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:
Sintáxis: [ Descargar ] [ Ocultar ]
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;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Y aquí el error de sintaxis que me da:

Sintáxis: [ Descargar ] [ Ocultar ]
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.
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Muchas gracias por tu atención y tu ayuda explorer.
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Re: Importar Excel a base de datos usando un archivo ".tabs"

Notapor explorer » 2011-06-13 09:23 @433

Disculpas. Parece que no te lo he explicado bien. Prueba con esto (no probado):

Sintáxis: [ Descargar ] [ Ocultar ]
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__
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: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

AnteriorSiguiente

Volver a Bases de datos

¿Quién está conectado?

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

cron