• Publicidad

Excel y Perl, lectura de celdas

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

Excel y Perl, lectura de celdas

Notapor jortiz_90 » 2011-02-01 13:32 @605

Hola a todos, soy nuevo en el foro y me ha servido de mucho, pero no encuentro respuesta a esta pregunta.

Estoy leyendo datos en Excel y tengo que contar las apariciones y llevar una sumatoria con unos montos asociados; necesito dos columnas: monto y el id. El asunto es que lo que me pareció más optimo es llevar un hash con el contador y la sumatoria, pero mi problema radica en la velocidad de lectura de los datos de Excel.

Podría hacer una macro que me haga una tabla dinámica, a todo esto los datos van en distintas hojas, pero prefiero trabajar íntegramente en Perl. Lo más lógico es ir iterando fila a fila, pero busco una solución más rápida.

¿Cómo aumento la velocidad de lectura siendo que uso Win32::OLE? ¿Spreadsheet::Read es más rápido?

De antemano, gracias.
jortiz_90
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-02-01 11:56 @539
Ubicación: Santiago, Chile

Publicidad

Re: Excel y Perl, lectura de celdas

Notapor explorer » 2011-02-01 13:50 @618

Bienvenido a los foros de Perl en Español, jortiz_90.

Spreadsheet::Read leerá toda el libro Excel a memoria, con lo que ahí tienes la ganancia de velocidad. Podría haber alguna limitación en cuanto al tamaño máximo del libro, pero para eso hay que leer los consejos que vienen en Spreadsheet::ParseExcel (módulo que usa Spreadsheet::Read para leer los Excel).

Otras opciones... como dices que lo que quieres es sacar información desde la hoja, podrías mirar el módulo DBIx::Report::Excel que justo eso: sacar informes desde una hoja Excel usando sentencias SQL. Este módulo hace uso del Data::Tabular::Dumper::Excel, que extrae la información de la hoja, en estructuras de datos de dos o tres dimensiones. En cambio, DBD::Excel sigue en estado alfa desde hace un montón de años...

Yo suelo usar Spreadsheet::Read, ya que, además de tener un interfaz sencillo, si un día el cliente se cansa de pagar por Excel y se pasa a OpenDocument, solo tendría que cambiar 3 caracteres en mi código ('xls' -> 'ods').
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Excel y Perl, lectura de celdas

Notapor jortiz_90 » 2011-02-01 14:13 @634

Creo que usaré Spreadsheet::Read, aunque la opción de utilizar SQL es bastante llamativa, pero ¿qué tal el manejo de datos?
jortiz_90
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-02-01 11:56 @539
Ubicación: Santiago, Chile

Re: Excel y Perl, lectura de celdas

Notapor explorer » 2011-02-02 04:49 @242

Pues no lo sé, pero es fácil hacer unas pruebas de velocidad... consiste en instalar los módulos, y hacer un programa que realice unas pruebas...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Excel y Perl, lectura de celdas

Notapor jortiz_90 » 2011-02-02 06:56 @331

Algo que no entendí es el cell_hander() que recomienda usar Spreadsheet::Parseexcel. ¿Cómo lee las celdas?
jortiz_90
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-02-01 11:56 @539
Ubicación: Santiago, Chile

Re: Excel y Perl, lectura de celdas

Notapor explorer » 2011-02-02 07:19 @347

Esa función es llamada por el analizador. Es ejecutada por cada celda leída. Lo tienes explicado con este ejemplo en la sección Reducing the memory usage of Spreadsheet::ParseExcel:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     #!/usr/bin/perl -w
  2.  
  3.     use strict;
  4.     use Spreadsheet::ParseExcel;
  5.  
  6.     my $parser = Spreadsheet::ParseExcel->new(
  7.         CellHandler => \&cell_handler,
  8.         NotSetCell  => 1
  9.     );
  10.  
  11.     my $workbook = $parser->parse('file.xls');
  12.  
  13.     sub cell_handler {
  14.  
  15.         my $workbook    = $_[0];
  16.         my $sheet_index = $_[1];
  17.         my $row         = $_[2];
  18.         my $col         = $_[3];
  19.         my $cell        = $_[4];
  20.  
  21.         # Do something useful with the formatted cell value
  22.         print $cell->value(), "\n";
  23.  
  24.     }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Fíjate: el método parse() lanza el proceso de interpretación del fichero indicado. Y en cada celda, cell_handler() es llamado con 5 parámetros: libro, número de hoja, fila, columna, y la propia celda. Lo que haga cell_handler() con la celda, ya es cosa tuya: almacenarla, cambiarla o desecharla. Nota además, que en el ejemplo se le ha pasado la opción NotSetCell => 1, que le indica a ParserExcel que no almacene el valor de la celda, lo que implica que deja en nuestra completa responsabilidad cómo almacenar la celda, dentro de cell_handler(). Podríamos crear una estructura tridimensional propia e ir guardando las celdas en ella, en lugar de depender de las estructuras de ParseExcel.

El porqué lo recomienda es porque en algunas ocasiones, la lectura de algún libro Excel puede llegar a agotar la memoria del equipo: por cada celda, ParseExcel guarda el valor de la celda y todos los atributos de formateo de la celda. Si, en cambio, la celda nos la pasa a nosotros en el cell_handler(), podemos decidir qué guardar y qué no.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Excel y Perl, lectura de celdas

Notapor jortiz_90 » 2011-02-02 08:02 @377

Lo que pasa es que necesito buscar en la primera fila dos columnas según un título que me lo sé, pero no así la ubicación (supuestamente), por eso preguntaba cómo lo lee, porque quiero primero leer la primera fila y luego iterar o hacer valer el cell_handler() (que, como leí, con eso no era necesario iterar).
Además estaba la opción de parseabort() que tampoco me quedó claro porque no sé qué prioriza la lectura.
jortiz_90
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-02-01 11:56 @539
Ubicación: Santiago, Chile

Re: Excel y Perl, lectura de celdas

Notapor jortiz_90 » 2011-02-02 11:03 @502

Me respondí solo: lee fila por fila y ParseAbort detiene el proceso de lectura, ahora lo que no sé es qué argumentos puede tener.
jortiz_90
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-02-01 11:56 @539
Ubicación: Santiago, Chile

Re: Excel y Perl, lectura de celdas

Notapor explorer » 2011-02-02 11:24 @517

Yo suelo hacer las siguientes operaciones:

1.- Creo un objeto Spreadsheet::Read con el nombre del libro Excel. En ese momento, todo el fichero pasa a memoria a una estructura tridimensional (se puede configurar cómo crearla).

2.- En la hoja que quiero tratar, leo la primera fila (con row()) y creo un hash que me relaciona el nombre de la columna con el índice de la columna (de esa manera, si el cliente cambia el orden de las columnas, el resto del programa no queda afectado).

3.- En ocasiones suelo poner una función más que me devuelve un hash que relaciona el nombre de la columna con el contenido de la celda correspondiente, para cada fila. De esa manera, para cada fila, puedo acceder a una celda indicando su título: $celda{'titulo'}

4.- Uno de los atributos que tiene cada hoja es el número máximo de filas, así que puedo realizar un bucle del 2 al máximo de filas para recorrer toda las filas (he dicho 2 porque la 1 es la fila de titulares) (existe otro atributo que indica el máximo de columnas)

5.- Puedo acceder a la hoja por medio de referencias: $hoja->{A5}, o por coordenadas: $hoja->{cells}[1][5].

Yo no me metería en historias de cell_handle() salvo en el caso de que tuviera un fichero Excel de millones de celdas.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Excel y Perl, lectura de celdas

Notapor jortiz_90 » 2011-02-02 14:29 @645

Tengo un archivo con 4 hojas de 55000 filas y 18 columnas (dinámico), con equipos de 2GB de RAM. ¿Empleo un cell_handler() o lo alojo en memoria siendo que solo ocupo 2 columnas?
jortiz_90
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-02-01 11:56 @539
Ubicación: Santiago, Chile

Siguiente

Volver a Básico

¿Quién está conectado?

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