Archivos

Usando Perl para extraer datos de archivos Excel

Existe una (mala) costumbre de almacenar datos en archivos excel en muchas organizaciones, grandes o pequeñas, esto funciona cuando los datos no son muchos y se pueden manejar rápidamente, pero por lo general esta información va creciendo y se va haciendo más difícil mantener la integridad de los datos, a veces se tienen varias versiones del archivo .xls, a veces se pierden o se borran por equivocación, etc.

Luego de pasar por todos estos problemas, se decide implementar algún sistema de información que permite manejar todos los datos de manera más eficiente, y claro no van a empezar a generar los registros otra vez por que ya los tienen en muchos archivos .xls. Ahí es cuando se empiezan a buscar soluciones para poder extraer estos datos rápidamente, y ahí es cuando viene Perl al rescate ;) . Existe un modulo (entre muchos) que nos permiten trabajar con archivos .xls sin necesidad de estar abriéndolos uno por uno Spreadsheet::ParseExcel, este modulo nos permite abrir archivos excel y extraer toda la información que contiene. Voy a poner un pequeño ejemplo del funcionamiento del modulo, supongamos que tenemos un archivo excel con la siguiente estructura:

Archivo Excel

Archivo Excel

Un archivo con 4 columnas, en este caso corresponden a la siguiente información: Nombre, Apellido, Cédula y Correo. Estos datos serán almacenados en la tabla “persona” en una BD Postgresql.

Se deben extraer los registros del archivo excel, identificar los campos, y luego almacenarlos en la BD, un ejemplo de como se puede hacer esto con Perl y SpreadSheet::ParseExcel es el siguiente script:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/perl
use Modern::Perl;
use Spreadsheet::ParseExcel;
use DBI;
use DBD::Pg;
 
my $userbd = "prueba"; #Nombre de usuario para la BD
my $passbd = "prueba"; #Password del usuario
my $bd = "prueba"; #Nombre de la BD
#conexión a la BD
my $dbh = DBI->connect("dbi:Pg:dbname=$bd",$userbd,$passbd) or die $DBI::errstr;
#sentencia SQL a ejecutar
my $query = "INSERT INTO persona (nombre, apellido, cedula, email) VALUES (?, ?, ?, ?)";
#se crea un objeto nuevo
my $parser = Spreadsheet::ParseExcel->new();
#se utiliza el metodo "Parse" para indicar el archivo .xls a usar
my $workbook = $parser->Parse('personas.xls');
#si no puedo "parsear" el archivo se termina el programa
die $parser->error(), ".\n" if !defined $workbook;
#indicamos que vamos a trabajar con la primera hoja
my $worksheet = $workbook->worksheet(0);
#obtenemos el rango de las filas usadas en la hoja
my ( $row_min, $row_max ) = $worksheet->row_range();
 
for my $row ( 0 .. $row_max ) {
 
 my $nombre = $worksheet->get_cell( $row, 0 );
 my $apellido = $worksheet->get_cell( $row, 1 );
 my $cedula = $worksheet->get_cell( $row, 2 );
 my $email = $worksheet->get_cell( $row, 3 );
 
 my $sth = $dbh->prepare($query);
 $sth->execute($nombre->value(),$apellido->value(),$cedula->value(),$email->value());
 $sth->finish;
 say "Persona: ", $nombre->value()," ",$apellido->value(), " - Cedula: ", $cedula->value(), " - Email:", $email->value() ,"\n";
 
}

En la línea 2 estamos haciendo uso del modulo Modern::Perl, que activa varias opciones al usar Perl 5.10, para más información puedes ver el post en Perliscopio: Usando Perl Moderno. De la línea 7 a la 11 está toda la información relacionada a la BD. En la línea 21 especificamos con cual de las hojas del archivo .xls vamos a trabar, en este caso con la primera que correspondería a la número 0, se pueden usar varias hojas en caso de que existan, en vez de  “worksheet”  usaríamos “worksheets”.

En la línea 25 obtenemos el rango de columnas que son utilizadas en la hoja, con esto podemos conocer donde están los registros dentro de la hoja, se puede además conocer la cantidad de columnas utilizadas usando la opción “col_range”. Luego en la linea 27 empezamos un ciclo recorriendo todas las filas para obtener los datos, para acceder a una celda se usa el método “get_cell”, con esto podemos tener acceso a varios atributos de la celda entre las cuales está la que más nos interesa que la que contiene el dato que vamos a usar para guardar el registro, y al que podemos acceder directamente con el metodo “value”.

En las líneas 32 al 34 se hacen las operaciones en la BD utilizando los métodos tradicionales de DBI, quizás para algunos casos más complicados se podría usar DBIx::Class, pero como en este caso solo utilizamos una tabla no es necesario.

Esto es solo un ejemplo sencillo de como realizar una tarea tan tediosa como puede ser extraer información de este tipo de archivos, además que se puede sacar más provecho al usar un lenguaje con tanta flexibilidad como Perl.

1 comment to Usando Perl para extraer datos de archivos Excel

Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">