• Publicidad

Error con DateTime::Format::Excel

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

Error con DateTime::Format::Excel

Notapor elistraus » 2013-03-08 08:10 @381

Saludos.

Tengo un problema, de perlero nuevo :(. No sé por qué me da error el módulo DateTime::Format::Excel al pasar la columna fecha leída desde el Excel, pero le entrego una fecha puesta, por ejemplo, a '25999' y me entrega bien la fecha. Es cuando le paso la variable desde la lectura con el Spreadsheet::Read.

Acá el ejemplo completo sobre Linux, le puede servir a cualquiera...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use strict;
  4. use Spreadsheet::Read;
  5. use DateTime::Format::Excel;
  6. my $home = "/home/elizalde/SRCVeI/";
  7. my $sector = '';
  8. my $columna = '';
  9.  
  10. my $ref = ReadData("matrimonioTest.xls", cell => 0, atrr => 1);
  11. die "ERROR: xls no encontrado \n";
  12.  
  13. #$columna = $ref->[1]{'A3'};
  14. $columna = $ref->[1]{cell}[1][3];
  15. print $columna. "\n";
  16. print $ref->[1]{label}. "\n";
  17.  
  18. my %HOJAS = %{$ref->[0]->{sheet}};          
  19. my $HOJA = $ref->[ $HOJAS{'Hoja1'} ]->{cell};
  20. open(TEST,"> mat");
  21. for (my $i = 1; $HOJA->[1]->[$i]; $i++) {
  22.         my $rut_h = $HOJA->[6]->[$i];
  23.         my $rut_m = $HOJA->[12]->[$i];
  24.         my $femat = $HOJA->[5]->[$i];              # Acá saco la fecha
  25.         my $num_h = length($rut_h);
  26.         if( $num_h != 8) {
  27.                 my $number_h = 8 - $num_h;
  28.                 for (my $j = 0; $j < $number_h; $j++){
  29.                         $rut_h = 0 .$rut_h;
  30.                 }
  31.         }
  32.         my $num_m = length($rut_m);
  33.         if( $num_m != 8){
  34.                 my $number_m = 8 - $num_m;
  35.                 for (my $j = 0; $j < $number_m; $j++){
  36.                         $rut_m = 0 .$rut_m;
  37.                 }
  38.         }
  39.         chomp($femat);                                   # Acá le saco el salto de línea
  40.         #print $femat;                                   # al hacer este print me imprime las fechas todas juntas, por lo que no tiene salto de línea
  41.         $femat = DateTime::Format::Excel->parse_datetime($femat);   # aquí da el error
  42.         print $rut_h." ".$rut_m." ".$femat."\n";
  43.         #print TEST $rut_h." ".$rut_m." ".$femat."\n";
  44. }
  45.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


y el error
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Invalid number of days at test-xls.pl line 41
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Ahora, si cambio el chomp() donde saco la fecha
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.        my $femat = chomp($HOJA->[5]->[$i]);              # Acá saco la fecha
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


me repite un fecha que nada que ver más encima
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
02278116 04717375 1899-12-30
03677085 04697870 1899-12-30
02317964 03876039 1899-12-30
02257829 05661316 1899-12-30
03114734 03031063 1899-12-30
02548299 06774063 1899-12-30
04377600 05258807 1899-12-30
02055320 02985158 1899-12-30
02724505 03827374 1899-12-30
03696535 03349395 1899-12-30
03679705 04078452 1899-12-30
02430607 04733001 1899-12-30
03374584 04029602 1899-12-30
02320512 03368484 1899-12-30
03947712 04561318 1899-12-30
02820813 04769460 1899-12-30
03047918 04243931 1899-12-30
04341582 05671534 1899-12-30
03561156 03734840 1899-12-30
03904098 05460381 1899-12-30
03218835 06508284 1899-12-30
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


A ver si alguien me dice dónde está mi error :roll: que no logro ver o si a lo mejor hay otra opción.

Saludos.
elistraus
Perlero nuevo
Perlero nuevo
 
Mensajes: 37
Registrado: 2011-10-31 23:37 @026

Publicidad

Re: Error con DateTime::Format::Excel

Notapor elistraus » 2013-03-08 08:53 @411

Me respondo solo :D El error era porque estaba imprimiendo la primera línea donde sale el título de la fecha, y por eso el módulo DataTime::Format::Excel no funcionaba...

Como me dí cuenta, a todas las millones de veces que explorer dice que ocupemos el Data::Dumper para ver lo que traen las variables...

Espero que les sea de utilidad a todos los nuevos perleros como yo :mrgreen:
elistraus
Perlero nuevo
Perlero nuevo
 
Mensajes: 37
Registrado: 2011-10-31 23:37 @026

Re: Error con DateTime::Format::Excel

Notapor explorer » 2013-03-08 18:06 @795

Varios comentarios.

Los atributos que se pasan a new(), los tienes mal puestos. Son 'cells' y 'attr'.

Tienes puesto que quieres que ReadData genere los atributos de las celdas ('attr'), pero en el resto del programa no lo usas, así que mejor poner attr => 0 para que no lo genere...

Finalmente... no necesitas usar el módulo DateTime::Format::Excel.

Ya sabes que, por defecto, los valores de las fechas se guardan como un número de punto flotante, del número de días que han pasado desde un determinado año (no me acuerdo cuál es. Consultar Spreadsheet::ParseExcel). Por eso usas el módulo de DateTime, para transformar ese número, a una fecha.

Pero, Spreadsheet::Read puede generar esos datos formateados (realmente, lo hace Spreadsheet::ParseExcel).

Si usas el atributo cells => 1, además de generar las celdas con notación con letra+número (por ejemplo, $HOJA->{'A1'}), guarda en ellos los datos de las celdas, formateados. Así que en el caso de guardar una fecha, obtendrás la fecha formateada (según el formato indicado por el atributo 'dtfmt' pasado a new()).

Naturalmente, acceder a las celdas con esa notación, es un infierno (salvo en los casos que sepamos la posición de las celdas que nos interesan). Para ello, hay dos ayudas:
  • la función cr2cell() transforma unas coordenadas de fila y columna, a notación de letra+número. Ejemplo: $celda = $HOJA->{ cr2cell ($columna, $fila) };
  • la función row() devuelve todos los valores, formateados, de una fila dada. Esta es la manera más cómoda, desde luego: solo tienes que hacer una sola llamada a una función para tener todos los valores, y además formateados. Ejemplo: my @fila = row($HOJA, $fila);
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Error con DateTime::Format::Excel

Notapor elistraus » 2013-03-13 08:49 @409

Gracias, explorer, por la aclaración, pero igual me perdí un poco con lo que me explicaste. Me quedó claro que escribí los valores, para cells y attr :roll:, ¿tu me podrías dar el ejemplo que me dices en el código que propuse?, para así entender mejor. No es por abusar pero hay cosas que todavía no entiendo :(...

Saludos
elistraus
Perlero nuevo
Perlero nuevo
 
Mensajes: 37
Registrado: 2011-10-31 23:37 @026


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron