• Publicidad

Script se detiene al leer Excel

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

Script se detiene al leer Excel

Notapor coltx » 2017-11-02 16:33 @731

Estimados, tengo el siguiente problema:

Estoy leyendo un archivo Excel con Spreadsheet::XLSX para insertar sus filas en una BD. El archivo tiene alrededor de 1100 líneas y al parecer es por la cantidad de líneas que el script se detiene antes de terminar y no inserta nada (estoy ejecutando desde un terminal como perl xxxx.pl xxxxx.xlsx). Digo lo de la cantidad de líneas ya que si dejo el archivo Excel solo en 100 líneas las toma e inserta sin problemas.

El siguiente es mi script:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use Spreadsheet::XLSX;
  4. use DBI;
  5. use lib 'libs/';
  6. use Funciones;
  7. use utf8;
  8.  
  9. # DATOS DE CONEXION PARA
  10. my $database    = "prueba";
  11. my $data_source = "DBI:mysql:$database;";
  12. my $username    = "usuario";
  13. my $password    = "pass";
  14.  
  15. my $sql = DBI->connect( $data_source, $username, $password )
  16.     or die "Couldn't connect to database: " . DBI->errstr;
  17.  
  18. my $excel = Spreadsheet::XLSX->new( @ARGV[0] );
  19.  
  20. my $sheet = $excel->{Worksheet}[0];
  21.  
  22. $sheet->{MaxRow} ||= $sheet->{MinRow};
  23.  
  24. my $LINEA = 0;
  25.  
  26. foreach my $row ( $sheet->{MinRow} .. $sheet->{MaxRow} ) {
  27.  
  28.     $LINEA++;
  29.     $sheet->{MaxCol} ||= $sheet->{MinCol};
  30.  
  31.     my $BRANCH = $sheet->{Cells}[$row][0]->{Val};
  32.  
  33.     if ( $CAMPOV ne "TITULO" ) {
  34.  
  35.         my $CAMPO1 = "";
  36.         my $CAMPO2 = "";
  37.         my $CAMPO3 = "";
  38.         my $CAMPO4 = "";
  39.         my $CAMPO5 = "";
  40.  
  41.         $CAMPO1 = $sheet->{Cells}[$row][1]->{Val};
  42.         $CAMPO2 = $sheet->{Cells}[$row][2]->{Val};
  43.         $CAMPO3 = $sheet->{Cells}[$row][3]->{Val};
  44.         $CAMPO4 = $sheet->{Cells}[$row][4]->{Val};
  45.         $CAMPO5 = $sheet->{Cells}[$row][5]->{Val};
  46.  
  47.         my $queryH = sprintf(
  48.             "INSERT INTO tabla (
  49.                                                         campo1,
  50.                                                         campo2,
  51.                                                         campo3,
  52.                                                         campo4,
  53.                                                         campo5
  54.                                                 ) VALUES (
  55.                                                         '$CAMPO1',
  56.                                                         '$CAMPO2',
  57.                                                        '$CAMPO3',
  58.                                                        '$CAMPO4',
  59.                                                        '$CAMPO5',)"
  60.         );
  61.  
  62.         my $dbh = DBI->connect( $data_source, $username, $password )
  63.             or die "Couldn't connect to database: " . DBI->errstr;
  64.         $dbh->do($queryH) or die "Couldn't insert to database: " . DBI->errstr;
  65.     }
  66. }
  67.  
  68.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2017-11-02 17:31 @771, editado 1 vez en total
Razón: Formateado de código con perltidy
coltx
Perlero nuevo
Perlero nuevo
 
Mensajes: 79
Registrado: 2011-09-16 08:01 @376

Publicidad

Re: Script se detiene al leer Excel

Notapor explorer » 2017-11-02 17:44 @781

Hay varias cosas del código, que no me gustan.

La línea 62 debe reemplazar a la 15. Es decir, en la línea 15 haces una conexión a la base de datos, y guardas el gestor de la conexión en $sql, pero luego ya no lo usas en el resto del programa. Si hubieras puesto "use warnings;" al principio del código, el propio Perl te habría advertido de esto.

El problema está en la línea 62: estás creando una nueva conexión a la base de datos por cada línea de la hoja. Es muy posible que esta sea la causa del agotamiento de conexiones.

La solución es esa: quitas la línea 15 y pones en su lugar la línea 62.

Otra cosa. Escribir @ARGV[0] es un error sintáctico en Perl 5. Lo correcto es $ARGV[0]

Otra cosa: la variable $CAMPOV nunca se inicializa. Si hubieras puesto "use strict;" al principio del programa, el propio Perl te habría advertido de esto.

Otra cosa: la variable $BRANCH se inicializa, pero nunca se usa.

Otra cosa: en la línea 59 hay una coma demás después de $CAMPO5. Comprueba que esa sintaxis es correcta con esa base de datos. Sí que es correcta en Perl, pero tengo dudas con respecto al SQL.

Otra cosa: te sobra el sprintf() de la línea 47 y el paréntesis de la 60. No necesitas nada para crear la consulta. Es una simple cadena de texto con entrecomillado doble.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Script se detiene al leer Excel

Notapor coltx » 2017-11-08 16:18 @720

Gracias, explorer, efectivamente el problema estaba en la línea 62. También he agregado 'use strict' y 'use warnings' para ayudarme.
coltx
Perlero nuevo
Perlero nuevo
 
Mensajes: 79
Registrado: 2011-09-16 08:01 @376


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 4 invitados