En vfp extraigo las variables $vnominal, $mPT, $pacep y $mpot.
En corriente extraigo las variables $CT, $CENS.
En datos extraigo once columnas de un mínimo de 2880 datos.
La hoja de datos es la que transformo a texto y la columna de fechas las transformo a un formato conveniente.
La hoja de datos está así:
Esta conversión la realizo con la ayuda del módulo SpreadSheet::ParseExcel y el archivo de texto resultado contiene dos columnas más uno de numeración y otra con la letra "i".
Adjunto el código que me transforma el Excel a texto y obtiene las variables antes mencionadas.
Using perl Syntax Highlighting
- use Spreadsheet::ParseExcel;
- $nombre = "AT911201.xls";
- sub CONVERSION {
- $a = 0;
- $b = 0;
- $c = 0;
- my $parser = Spreadsheet::ParseExcel->new();
- my $libro = $parser->parse($nombre);
- if ( !defined $libro ) {
- die $parser->error(), ".\n";
- }
- my $hojanombre;
- my $hoja;
- my $indice;
- my $hojas = $libro->worksheets();
- for $indice ( $libro->worksheets() ) {
- $hojanombre = $indice->get_name();
- $hojanombre = lc($hojanombre);
- if ( $hojanombre eq "vfp" ) {
- $hoja = $indice;
- $a = 1;
- last;
- }
- }
- if ( $a == 1 ) {
- $vnominal = $hoja->get_cell( 1, 3 )->value(); #VARIABLES
- $mPT = $hoja->get_cell( 2, 3 )->value();
- $pacep = $hoja->get_cell( 3, 3 )->value();
- $mpot = $hoja->get_cell( 4, 3 )->value();
- }
- for $indice ( $libro->worksheets() ) {
- $hojanombre = $indice->get_name();
- $hojanombre = lc($hojanombre);
- if ( $hojanombre eq "corriente" ) {
- $hoja = $indice;
- $b = 1;
- last;
- }
- }
- if ( $b == 1 ) {
- $CT = $hoja->get_cell( 2, 6 )->value(); #VARIABLES
- $CENS = $hoja->get_cell( 3, 6 )->value();
- }
- for $indice ( $libro->worksheets() ) {
- $hojanombre = $indice->get_name();
- $hojanombre = lc($hojanombre);
- if ( $hojanombre eq "datos" ) {
- $hoja = $indice;
- $c = 1;
- last;
- }
- }
- if ( $c == 1 ) {
- my ( $minfila, $maxfila ) = $hoja->row_range;
- my ( $mincol, $maxcol ) = $hoja->col_range;
- my @linea = ();
- my $string;
- $contador = 0;
- for my $fila ( $minfila .. $maxfila ) {
- @linea = ();
- for my $columna ( $mincol .. $maxcol ) {
- my $celda = $hoja->get_cell( $fila, $columna );
- if ( defined($celda) ) {
- #
- my $variable = $celda->value();
- if ( $columna == 0 and $fila > 0 ) { #CONVERTIMOS EL FORMATO DE FECHA
- my @cantidades = split( "-", $variable );
- if ( $cantidades[1] eq "Ene" ) {
- $cantidades[1] = "01";
- }
- if ( $cantidades[1] eq "Feb" ) {
- $cantidades[1] = "02";
- }
- if ( $cantidades[1] eq "Mar" ) {
- $cantidades[1] = "03";
- }
- if ( $cantidades[1] eq "Abr" ) {
- $cantidades[1] = "04";
- }
- if ( $cantidades[1] eq "May" ) {
- $cantidades[1] = "05";
- }
- if ( $cantidades[1] eq "Jun" ) {
- $cantidades[1] = "06";
- }
- if ( $cantidades[1] eq "Jul" ) {
- $cantidades[1] = "07";
- }
- if ( $cantidades[1] eq "Ago" ) {
- $cantidades[1] = "08";
- }
- if ( $cantidades[1] eq "Sep" ) {
- $cantidades[1] = "09";
- }
- if ( $cantidades[1] eq "Oct" ) {
- $cantidades[1] = "10";
- }
- if ( $cantidades[1] eq "Nov" ) {
- $cantidades[1] = "11";
- }
- if ( $cantidades[1] eq "Dic" ) {
- $cantidades[1] = "12";
- }
- my @cantidadess = split( " ", $cantidades[2] );
- chop( $cantidadess[1] );
- chop( $cantidadess[1] );
- chop( $cantidadess[1] );
- chop( $cantidadess[1] );
- my $temporal = $cantidadess[0];
- $cantidadess[0] = $cantidades[0];
- $cantidades[0] = $temporal;
- $cantidades[2] = join( " ", @cantidadess );
- $variable = join( "/", @cantidades );
- }
- push( @linea, $variable );
- #
- }
- else {
- $celda = "";
- push( @linea, $celda );
- }
- }
- my $string = join( "\t", @linea ); #CONSTRUIMOS EL ARCHIVO LINEA A LINEA
- $string = "$contador\t" . "i\t" . $string;
- $nombre =~ s/.xls/.txt/; #CAMBIAMOS DE EXTENSIÓN .xls-->.txt
- $nombre = ">>" . $nombre; #SOBREESCRIBIREMOS
- open( ARCHIVO, $nombre ) or die "no se encuentra\n";
- print ARCHIVO "$string\n";
- close ARCHIVO;
- $contador++;
- }
- }
- }
Coloreado en 0.007 segundos, usando GeSHi 1.0.8.4
El proceso completo se tarda 1 minuto 45 segundos, aproximadamente.
Me pregunto si alguien tiene una idea para optimizar la rutina.
Gracias por adelantado.