#!/usr/bin/perl
use v5.14;
use autodie;
use Text::CSV;
## Constantes y definiciones ################################################
my $archivo = 'Rep_PnL_X_Mon_SP.csv';
my @portafolios = (
[ 'Pensiones', [ '>>MXP' ]],
[ 'PBG', [ '>>MXP' ]],
[ 'PBGVto', [ '>>MXP' ]],
[ 'PBGMdo', [ '>>UDI' ]],
[ 'Seguros', [ '>>MXP' ]],
[ 'PIB', [ '>>MXP' ]],
[ 'SBG', [ '>>MXP' ]],
[ 'SBGVto', [ '>>MXP' ]],
[ 'SBGMdo', [ '>>MXP' ]],
[ 'SBGMNoVida', [ '>>MXP' ]],
[ 'SBGMVida', [ ]],
[ 'PBGVOtro', [ '>>UDI', '>>MXP' ]],
[ 'PBGVRva', [ '>>UDI', '>>MXP' ]],
[ 'SBGVVida', [ '>>USD', '>>UDI', '>>MXP' ]],
[ 'SBGVNoVida', [ '>>USD', '>>UDI', '>>MXP' ]],
[ 'SEGPATR', [ '>>USD', '>>UDI', '>>MXP' ]],
[ 'SEGPAVC', [ '>>UDI', '>>MXP' ]],
[ 'SEGPAVE', [ '>>UDI', '>>MXP' ]],
[ 'SEGPAVM', [ '>>UDI', '>>MXP' ]],
[ 'SEGPAS', [ '>>UDI', '>>MXP' ]],
[ 'SEGCREC', [ ]],
);
my @cabeceras;
for my $portafolio_ref (@portafolios) {
push @cabeceras, $portafolio_ref->[0];
my @monedas = @{$portafolio_ref->[1]};
if (@monedas) {
push @cabeceras, @monedas;
}
}
## Lectura ##################################################################
my @filas;
my $csv = Text::CSV->new()
or die "ERROR: No puedo usar CSV: " . Text::CSV->error_diag(). "\n";
open my $fh, '<:crlf', $archivo;
while (my $fila = $csv->getline($fh)) {
next if $fila->[1] eq 'Instrument'
or $fila->[1] eq 'Cash'
;
push @filas, $fila;
}
$csv->eof or $csv->error_diag(); # cerramos el csv
close $fh;
## Proceso ##################################################################
say "Reporte: $archivo";
say join ',', ('') x @cabeceras; # líneas sin datos
say join ',', ('') x @cabeceras;
say join ',', @cabeceras; # cabeceras
my $fecha_actual = $filas[0][0]; # primera fecha de la entrada
my %monedas; # valores de las monedas, por cada portafolio
my %portafolios; # almacén de los portafolios que vamos leyendo para una fecha
for my $fila (@filas) { # para todas las filas
my @campos = @$fila; # campos de esa fila
if ($fecha_actual ne $campos[0]) { # hay cambio de fecha
saca_portafolio(); # sacamos los portafolios de la fecha anterior
$fecha_actual = $campos[0]; # recordamos la nueva fecha
}
if ($campos[1] =~ /^>>/) { # si lo leído es una moneda
$monedas{$campos[1]} = $campos[3]; # guardamos su valor
}
else { # si no lo es, es el valor de un portafolio
# guardamos las monedas leídas junto con el portafolio y el total
$portafolios{$campos[1]} = { %monedas, total => $campos[3] };
%monedas = (); # vaciamos el monedero, para el siguiente portafolio
}
}
saca_portafolio(); # sacar la última fecha pendiente del archivo de entrada
sub saca_portafolio {
my @nueva_linea;
push @nueva_linea, $fecha_actual;
for my $portafolio (@portafolios) { # por cada portafolio
my $nombre = $portafolio->[0];
# primero sacamos el total
push @nueva_linea, $portafolios{$nombre}{total};
for my $moneda (@{$portafolio->[1]}) { # y luego las monedas, en el orden indicado al principio del programa
push @nueva_linea, $portafolios{$nombre}{$moneda};
}
}
say join ',', @nueva_linea; # separados por comas
}