• Publicidad

Spreadsheet::Read problemas con las fechas

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

Spreadsheet::Read problemas con las fechas

Notapor MARKO » 2012-02-07 05:43 @280

Saludos, Perl en Español, acudo a Uds. para resolver un problema.

Anteriormente estaba usando Spreadsheet::ParseExcel para analizar archivos .xls pero recientemente me vi en la necesidad de ajustar la aplicación para analizar también archivos .xlsx, por lo cual opté por usar Spreadsheet::Read; todo funciona bien pero...

Yo tengo fechas de esta forma:
Imagen
en archivos .xls y .xlsx.

El proceso de los archivos .xls está muy bien ya que pudo obtener el texto formateado o cadena de la fecha que está en la celda. Por ejemplo, "2011-oct-01 00:00:oo.000", pero cuando es de un archivo .xlsx no funciona ya que no obtiene el "texto" dentro de la celda sino que la cantidad de días que representa dicha fecha desde 1900, o sea, "40817".

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $libro=ReadData($nombre);
  2. my $maxfila= $libro->[1]->{maxrow};
  3. my $maxcol= $libro->[1]->{maxcol};
  4.  
  5. for my $fila (3..$maxfila){
  6.                        
  7.   @linea=();
  8.   for my $columna (1..13){
  9.     my $celda=$libro->[1]{cr2cell($columna,$fila)};  #contenido formateado de la celda.
  10.     if (defined($celda)){
  11.       my $variable = $celda;
  12.         if ($columna==1 and $fila > 3){
  13.           if (length($variable)==24){
  14.             my($anio, $mes, $dia, $hora) = $variable =~ /^(\d+)-(\D+)-(\d+) ([\d:]+)/i;
  15.             If (defined $fechas{lc($mes)}) {
  16.                $mes = $fechas{lc($mes)};
  17.             }
  18.             $variable = "$dia/$mes/$anio $hora";
  19.           }
  20.         }
  21.        push (@linea, $variable);
  22.      }
  23.      else{
  24.           $celda="";
  25.      push (@linea, $celda);
  26.      }
  27.    }
  28.  my $string = join ("\t",@linea);
  29.  $string = "$contador\t"."i\t".$string."\n";
  30.  push(@vector,$string);
  31.  $contador++;  
  32. }
  33.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Lo que no logro entender es cómo es que esta línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $celda=$libro->[1]{cr2cell($columna,$fila)};  # contenido formateado de la celda.
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

sí hace la tarea deseada en los archivos .xls y no funciona en .xlsx.

¿¿¿Alguien me podría ayudar???

Gracias.
MARKO
Perlero nuevo
Perlero nuevo
 
Mensajes: 86
Registrado: 2012-01-10 22:34 @982

Publicidad

Re: Spreadsheet::Read problemas con las fechas

Notapor explorer » 2012-02-07 07:53 @370

Pues no estoy seguro, si tendrás que definir el valor del atributo dtfmt...

En cualquier caso, con el módulo DateTime::Format::Excel se puede pasar de un formato a otro.
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: Spreadsheet::Read problemas con las fechas

Notapor MARKO » 2012-02-07 11:32 @522

He probado varias cosas y sigue sin funcionar correctamente. Con xls sí funciona pero en xlsx sigue desplegando el número de días desde 1900 en vez del "texto" de la celda. El problema está en que la aplicación tendrá que examinar una cantidad numerosa de archivos, y

1. no todos vienen en xls o xlsx, sino que combinados
2. algunos tienen el formato yyy-mmm-dd hh:mm:ss.000 y otros el formato dd/mm/yyyy hh:mm:ss por lo cual no le puedo definir un formato especifico de fecha para que funcione ya que no es el mismo para todos.

Respecto a DateTime::Format::Excel, por lo que observé ese módulo solo maneja año, mes y día pero no horas minutos y segundos.

Por la ayuda estaré muy agradecido.
MARKO
Perlero nuevo
Perlero nuevo
 
Mensajes: 86
Registrado: 2012-01-10 22:34 @982

Re: Spreadsheet::Read problemas con las fechas

Notapor explorer » 2012-02-07 12:14 @551

Se podrían usar expresiones regulares para detectar cada tipo de fecha, o una combinación de ello junto con DateTime::Format::DateManip o DateTime::Format::DateParse.

Que el módulo DateTime::Format::Excel devuelva fracciones de día depende de si en la celda aparece un número entero o decimal, como se indica en la sinopsis.
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: Spreadsheet::Read problemas con las fechas

Notapor MARKO » 2012-02-07 16:29 @729

explorer escribiste:Se podrían usar expresiones regulares para detectar cada tipo de fecha,


El problema radica en que a mi variable "$celda" no llega un texto para poder aplicar expresiones regulares sino que de una vez llega el número real de días que pasaron desde 1900.

Lo que me sigue confundiendo es que para el formato xls, las rutinas funcionan perfectamente y para el xlsx no funcionan como "deberían", o sea, si presentan un resultado el cual es el número de días que es ilógico ya que lo que estoy pidiendo es el contenido de la celda "formateada".

Saludos.
MARKO
Perlero nuevo
Perlero nuevo
 
Mensajes: 86
Registrado: 2012-01-10 22:34 @982

Re: Spreadsheet::Read problemas con las fechas

Notapor explorer » 2012-02-07 18:27 @810

Da igual que sea un número o una cadena de caracteres. Una expresión regular puede decirte si el contenido de la celda corresponde completamente a un número decimal, por lo que sabes que debes realizar la conversión.

Y la explicación de por qué dan resultados distintos según sea xls o xlsx, es porque el proceso de lectura del fichero la realizan módulos distintos.

Ya digo que esto es una cosa que se debería investigar, porque suena a que algo del módulo que lee xlsx hace mal.
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: Spreadsheet::Read problemas con las fechas

Notapor MARKO » 2012-02-13 20:43 @904

La misma sintaxis que tenía empezó a funcionar de repente, lo único que hice fue copiarla en una hoja nueva y correrla línea por línea para ir viendo cómo funcionaba y afortunadamente ahora sí funciona.

:D Gracias, Perl en Español.
MARKO
Perlero nuevo
Perlero nuevo
 
Mensajes: 86
Registrado: 2012-01-10 22:34 @982


Volver a Básico

¿Quién está conectado?

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

cron