• Publicidad

Problema con Excel y formatos de fechas

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

Problema con Excel y formatos de fechas

Notapor bvayap » 2013-11-07 18:04 @794

Hola a todos,

Tengo un problema con Excel y las fechas. Tengo un xls de la forma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
PRODUCTO  COMERCIAL   TARIFA       FECHA             CLIENTE            UDS_VENTA
th5589     EMV34        F2      27/12/2011 0:00       11222             1
tj7753     EMV34        F2      29/12/2011 0:00       9845              1
h65ed      EMV02        G5      02/01/2012 0:00       66038             1
th5589     EMV56        F1      10/01/2012 0:00       11462             2
tj7753     EMV34        G2      12/01/2012 0:00       40035             1
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

El tema es que quiero sacar las unidades vendidas en un determinado mes.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use Excel::Writer::XLSX;
  3. use Spreadsheet::XLSX;
  4. use Spreadsheet::ParseExcel;
  5. use Spreadsheet::Read;
  6. use strict;
  7. use diagnostics;
  8. use autodie;
  9. use DateTime::Format::Excel;
  10.  
  11. # Creamos un nuevo libro y abrimos el actual para lectura
  12. my $workbook2  = Excel::Writer::XLSX->new( "Salida.xlsx" );
  13. my $worksheet2 = $workbook2->add_worksheet();
  14.  
  15. # Leemos el fichero y lo metemos en $puertos
  16. my $parser   = Spreadsheet::ParseExcel->new();
  17. my $workbook = $parser->parse('ventas.xls');
  18. if ( !defined $workbook ) {
  19.         die $parser->error(), ".\n";
  20. }
  21. my $venta_tot = 0;
  22. for my $worksheet ( $workbook->worksheets() ) {
  23.         my ( $row_min, $row_max ) = $worksheet->row_range();
  24.         my ( $col_min, $col_max ) = $worksheet->col_range();
  25.         for my $row ( 1 .. $row_max ) {
  26.                 my $fecha = $worksheet->get_cell( $row, 3);
  27.                 print $fecha->value()."\n";
  28.                 my $producto = $worksheet->get_cell( $row, 0);
  29.                 my $venta = $worksheet->get_cell( $row, 6);
  30.                 next unless $fecha;
  31.                 if ($fecha->value() =~ /01\/12/) {
  32.                         $venta_tot = $venta_tot + ($venta->value());
  33.                         $worksheet2->write( $row, 0, $fecha->value() );
  34.                         $worksheet2->write( $row, 1, $venta->value() );
  35.                         $worksheet2->write( $row, 2, $producto->value() );
  36.                 }
  37.         }
  38. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


y guardarlo en el fichero salida.xls. Al ejecutarlo, el fichero queda en blanco, y he visto que el print de la linea 27 que he puesto para ver la salida queda así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
12-27-11 0:00
12-29-11 0:00
1-2-12 0:00
1-10-12 0:00
1-12-12 0:00
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

y por eso creo que no entra en el if de la línea 31. He estado consultando algún hilo anterior pero no encuentro la solución para que respete el formato de fecha tal como aparece en la Excel. ¿Alguna sugerencia?

Gracias de antemano.
bvayap
Perlero nuevo
Perlero nuevo
 
Mensajes: 31
Registrado: 2013-05-31 02:42 @154

Publicidad

Re: Problema con Excel y formatos de fechas

Notapor explorer » 2013-11-07 18:39 @819

No entra porque la fecha te llega con guiones como separador de las cifras, mientras que en la expresión regular estás usando '/' como separador.

Además, el value() te devuelve las cifras sin el '0' de relleno, así que tampoco te localizará "01-12".

Con esta expresión te debería valer: /\D1\D12 /, que quiere decir:
  • busca un carácter que no es dígito (\D),
  • seguido por un '1',
  • seguido de un carácter que no es un dígito (\D),
  • seguido por '12',
  • y seguido por un espacio en blanco
Lo del espacio en blanco es importante. Estamos indicando que ese 12 es el número del año, por lo que estamos buscando por enero del 2012, no por el 12 de enero.
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: Problema con Excel y formatos de fechas

Notapor bvayap » 2013-11-08 07:35 @357

Hola, explorer.

Gracias por tu respuesta.

Eso es justo lo que no entiendo: ¿por qué si la fecha tiene el formato dd/mm/yyyy al leerla llega con formato m-d-yy? ¿No hay forma de que respete este formato? Lo intenté con una función ValFormat() que aparecía en algún hilo anterior, pero no funcionaba.

La expresión que propones tampoco me funciona, ya que la fecha de enero llega como 1-dd-12...

Gracias por tu ayuda.
bvayap
Perlero nuevo
Perlero nuevo
 
Mensajes: 31
Registrado: 2013-05-31 02:42 @154

Re: Problema con Excel y formatos de fechas

Notapor explorer » 2013-11-08 08:44 @405

Excel guarda los datos en formato crudo. Eso quiere decir que las fechas, realmente, son un número (el número de días que pasa desde la fecha que Excel toma como origen).

El formateo se hace en el momento. Según veo en Spreadsheet::ParseExcel::FmtDefault, se trataría del formato
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    0x16 => 'm-d-yy h:mm',
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


No encuentro el hilo que hace referencia a 'ValFormat'. ¿Puedes pasarme el enlace?

Prueba con esta exp. reg.: /^1-\d+-12/
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: Problema con Excel y formatos de fechas

Notapor bvayap » 2013-11-08 08:53 @411

Gracias, explorer. Con esa expresión sí me funciona bien, pero no termina de convencerme porque no termino de entender lo del formato... Soy así de cabezota :)

Perdón, era ValFmt(), en el hilo Importar fechas Excel.

Gracias. Sigo buscando.
bvayap
Perlero nuevo
Perlero nuevo
 
Mensajes: 31
Registrado: 2013-05-31 02:42 @154

Re: Problema con Excel y formatos de fechas

Notapor explorer » 2013-11-08 11:04 @503

Puedes hacer otra cosa: extraes el valor en crudo de la celda (como se comenta en el hilo que dices), y luego, con módulos como DateTime::Format::Excel lo pasas a objeto DateTime, y de ahí ya lo puedes formatear como quieras.

Otra opción: sabiendo que queremos los datos de un determinado rango de fechas calculamos los valores enteros correspondientes (partiendo de 1900, como lo hace Excel). Entonces, en el if() solo hay que comprobar si el dato en crudo de la celda está dentro de ese rango de valores enteros. (Esta no es una solución muy clara, pero solución al menos.).
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


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 2 invitados