• Publicidad

Transponer y descartar campos

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

Transponer y descartar campos

Notapor sufisavey80 » 2013-08-02 10:48 @492

Muy buenos días.

Me gustaría saber si me pueden apoyar, por favor, con el siguiente caso:

Tengo un archivo de entrada el cual adjunto (Archivo_Entrada.csv), que contiene cuatro columnas, donde las columnas a imprimir son las 1, 2 y 4, siendo diferentes las filas a "Instrument" y "Cash" de la columna 2, trasponiendo "Pensiones, PBG, PBGVto, PBGMdo, Seguros, PIB, SBG, SBGVto, SBGMdo" de la columna 2 como encabezado con sus respectivos valores de la columna 1 y 4, como se muestra en el archivo adjunto de salida (Archivo_salida.csv).

Espero que me expliqué y gracias de antemano por el apoyo.

Saludos cordiales.
Adjuntos
Archivo_salida.csv
Este es el archivo de salida
(1.15 KiB) 129 veces
Archivo_Entrada.csv
Este es el archivo de entrada
(9.22 KiB) 109 veces
sufisavey80
Perlero nuevo
Perlero nuevo
 
Mensajes: 29
Registrado: 2012-11-07 18:17 @803

Publicidad

Re: Transponer y descartar campos

Notapor explorer » 2013-08-03 10:26 @476

Esta es una posible solución:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.16;
  3. use autodie;                    # «Es mejor morir que regresar con deshonor» --proverbio Klingon
  4.  
  5. my %transacciones;
  6.  
  7. open my $entrada, '<:crlf', 'Archivo_Entrada.csv';      # el documento es de tipo MSDOS
  8. while (<$entrada>) {
  9.     next if /(^Reporte|Instrument|Cash)/;               # saltamos las líneas no interesantes
  10.     chomp;                                              # quitamos fin de línea
  11.  
  12.     my @campos = split /[,]/;                           # partimos
  13.  
  14.     next if @campos != 4;                               # comprobamos que son 4 campos
  15.  
  16.     my($fecha, $tipo, undef, $valor) = @campos;
  17.  
  18.     $transacciones{ $fecha }{ $tipo } = $valor;         # guardamos el dato
  19. }
  20. close $entrada;
  21.  
  22. #use Data::Dumper;
  23. #say Dumper \%transacciones;
  24.  
  25. my @cabeceras = qw(
  26.     Pensiones   PBG     PBGVto  PBGMdo
  27.     Seguros     PIB     SBG     SBGVto  SBGMdo
  28. );
  29.  
  30. open my $salida, '>:crlf', 'Archivo_salida.csv';        # salida en formato MSDOS
  31.  
  32. say $salida join q[,], "", @cabeceras;                  # cabeceras en salida
  33.  
  34. for my $fecha (reverse sort keys %transacciones) {      # salida de fechas en orden alfabético inverso
  35.  
  36.     say $salida join q[,],  $fecha, map { $transacciones{$fecha}{$_} // '' } @cabeceras;
  37. }
  38.  
  39. close $salida;
  40.  
  41. __END__
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
La salida es idéntica a la esperada. Prueba:
Código: Seleccionar todo
$ diff -s Archivo_salida_org.csv Archivo_salida.csv
Los ficheros Archivo_salida_org.csv y Archivo_salida.csv son idénticos
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Transponer y descartar campos

Notapor sufisavey80 » 2013-08-05 11:21 @515

Hola, explorer... ¡Muy buen día! Excelente información, como siempre.

Ya estoy probando el código y me arroja el siguiente error de la línea 36. He buscado la causa del error pero no doy con la solución en relación al patrón de búsqueda. ¿Crees que sea la ejecución del programa o algo en la sintaxis?

Search pattern not terminated at Cambia_formato_reportes_PnL_final.pl line 36.

línea 36:
say $salida join q[,], $fecha, map { $transacciones{$fecha}{$_} // '' } @cabeceras;

Muchas gracias.
sufisavey80
Perlero nuevo
Perlero nuevo
 
Mensajes: 29
Registrado: 2012-11-07 18:17 @803

Re: Transponer y descartar campos

Notapor explorer » 2013-08-05 11:34 @523

Hola.

El error te sale porque has quitado la línea

use v5.16;

Las dos barras diagonales no son una expresión regular, sino el operador defined-or, que está disponible desde la versión Perl v5.10.0.

Si tienes un Perl distinto a v5.16, pero superior a v5.10, pues esa es la versión que debes poner en el 'use'.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Transponer y descartar campos

Notapor sufisavey80 » 2013-08-05 11:55 @538

Perfecto... es como lo mencionas, yo tengo la versión "This is perl, v5.8.4 built for sun4-solaris-64int" ¿qué se podría hacer para que funcione con esta versión(v5.8.4)?

Gracias y Saludos.
sufisavey80
Perlero nuevo
Perlero nuevo
 
Mensajes: 29
Registrado: 2012-11-07 18:17 @803

Re: Transponer y descartar campos

Notapor explorer » 2013-08-05 12:10 @548

La versión v5.8.4 salió el 21 de abril de 2004... hace más de nueve años... tienes un sistema muy antiguo, pero viendo que es un Solaris, no me extraña :)

Por fortuna, Perl mantiene una buena compatibilidad, así que es posible hacer unos pequeños cambios para que funcione en algo tan arcaico.

  • debes cambiar todos los say() por print() con un "\n" al final
  • ya que tampoco te sirve 'autodie', debes poner 'or die...' a todos los open()
  • la expresión

    $transacciones{$fecha}{$_} // ''

    la debes cambiar por

    defined($transacciones{$fecha}{$_}) ? $transacciones{$fecha}{$_} : ''
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Transponer y descartar campos

Notapor sufisavey80 » 2013-08-05 17:02 @751

Así es... explorer, es muy antiguo mi sistema :D Ya realicé los ajustes y ya está funcionando, te agradezco mucho tu apoyo y que estés bien...
sufisavey80
Perlero nuevo
Perlero nuevo
 
Mensajes: 29
Registrado: 2012-11-07 18:17 @803

Re: Transponer y descartar campos

Notapor sufisavey80 » 2014-04-09 17:13 @759

¿Qué tal...? Muy buenas tardes.

De nuevo con este tema de transponer. Quisiera saber si me pueden apoyar ya que estoy utilizando el código relacionado a este tema y necesita añadir en el archivo de salida los encabezados >>MXP >>USD >>UDI correspondientes a cada línea del archivo de entrada, pero el resultado no es el esperado sobre estos encabezados específicamente ya que imprime el último encontrado (de >>MXP >>USD >>UDI) por cada fecha.

Adjunto los archivos ejemplo de entrada (Rep_PnL_X_Mon_SP.csv) y salida (Reporte_PnL_X_Mon_SP.csv)

¡Muchas gracias!

---------------------------------------------------------------------------------------
#!/usr/bin/perl

#use v5.8.4;
#use autodie;

my %transacciones;
my $contenido;
my $encabezado;
#my $fecha = time ();

open my $entrada, '<:crlf', '/herramientas/Algorithmics/riesgos_m/riesgos_p/20140331/riskwatch/reports/Rep_PnL_X_Mon_SP.csv'; # es de tipo MSDOS
while (<$entrada>) {
next if /(^Reporte|Instrument|Cash)/; # saltamos las lineas no interesantes
chomp; # quitamos fin de linea

my @campos = split /[,]/; # partimos

next if @campos != 4; # comprobamos que son 4 campos

my($fecha, $tipo, undef, $valor) = @campos;

$transacciones{ $fecha }{ $tipo } = $valor; # guardamos el dato
}
close $entrada;

#use Data::Dumper;
#say Dumper \%transacciones;

my @cabeceras = qw(
Pensiones >>MXP PBG >>MXP PBGVto >>MXP PBGMdo >>UDI
Seguros >>MXP PIB >>MXP SBG >>MXP SBGVto >>MXP SBGMdo >>MXP SBGMNoVida >>NXP SBGMVida
PBGVOtro >>UDI >>MXP PBGVRva >>UDI >>MXP SBGVVida >>UDI >>MXP SBGVNoVida >>USD >>UDI >>MXP
SEGPATR >>USD >>UDI >>MXP SEGPAVC >>UDI >>MXP SEGPAVE >>UDI >>MXP SEGPAVM >>UDI >>MXP SEGPAS >>UDI >>MXP SEGCREC
);

open my $salida, '>:crlf', '/herramientas/Algorithmics/riesgos_m/riesgos_p/20140331/riskwatch/reports/Reporte_PnL_X_Mon_SP.csv'; # salida en formato MSDOS

$encabezado = join q[,], "", @cabeceras; # cabeceras en salida
print $salida "Reporte: Reporte_PnL_X_Mon_SP.csv\n\n\n";
#print $salida $fecha;
print $salida $encabezado."\n";

for my $fecha (reverse sort keys %transacciones) { # salida de fechas en orden alfabético inverso

$contenido = join q[,], $fecha, map { defined($transacciones{$fecha}{$_}) ? $transacciones{$fecha}{$_} : '' } @cabeceras;
print $salida $contenido."\n";
}

close $salida;
Adjuntos
Reporte_PnL_X_Mon_SP.csv
Archivo Salida
(3.21 KiB) 69 veces
Rep_PnL_X_Mon_SP.csv
Archivo Entrada
(20.1 KiB) 77 veces
sufisavey80
Perlero nuevo
Perlero nuevo
 
Mensajes: 29
Registrado: 2012-11-07 18:17 @803

Re: Transponer y descartar campos

Notapor explorer » 2014-04-10 16:45 @740

Pues... a mi me funciona...

Quiero decir, que el programa me genera esa salida.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Transponer y descartar campos

Notapor sufisavey80 » 2014-04-10 17:56 @789

¿Qué tal, explorer...?

Aquí adjunto el archivo que debería de salir(Archivo_Salida_Bueno.csv) lo edité a mano, el detalle es que por decir en los siguientes tres bloques del archivo de entrada los encabezados ">>MXP" no corresponden en el archivo de salida que primero mandé (Reporte_PnL_X_Mon_SP.csv) y así sucesivamente con los demás bloques.

¡Muchas gracias!

Primer bloque del archivo de Entrada:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  SSHIST_2014-03-31_1 (0.002)   >>MXP   2014/03/31 (0)  -254237475.72611237 MXP
  SSHIST_2014-03-31_1 (0.002)   Instrument      2014/03/31 (0)  -254237475.72611237 MXP
  SSHIST_2014-03-31_1 (0.002)   Cash    2014/03/31 (0)  0 MXP
  SSHIST_2014-03-31_1 (0.002)   Pensiones       2014/03/31 (0)  -254237475.72611237 MXP
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Segundo bloque del archivo de entrada:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  SSHIST_2014-03-31_1 (0.002)   >>MXP   2014/03/31 (0)  -254237475.72611237 MXP
  SSHIST_2014-03-31_1 (0.002)   Instrument      2014/03/31 (0)  -254237475.72611237 MXP
  SSHIST_2014-03-31_1 (0.002)   Cash    2014/03/31 (0)  0 MXP
  SSHIST_2014-03-31_1 (0.002)   PBG     2014/03/31 (0)  -254237475.72611237 MXP
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Tercer bloque del archivo de entrada:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  SSHIST_2014-03-31_1 (0.002)   >>MXP   2014/03/31 (0)  -254305282.74230957 MXP
  SSHIST_2014-03-31_1 (0.002)   Instrument      2014/03/31 (0)  -254305282.74230957 MXP
  SSHIST_2014-03-31_1 (0.002)   Cash    2014/03/31 (0)  0 MXP
  SSHIST_2014-03-31_1 (0.002)   PBGVto  2014/03/31 (0)  -254305282.74230957 MXP
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Adjuntos
Archivo_Salida_Bueno.csv
(3.59 KiB) 66 veces
sufisavey80
Perlero nuevo
Perlero nuevo
 
Mensajes: 29
Registrado: 2012-11-07 18:17 @803

Siguiente

Volver a Básico

¿Quién está conectado?

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

cron