• 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.

Re: Transponer y descartar campos

Notapor explorer » 2014-04-10 19:18 @846

Bueno, la razón de que solo salga la última cabecera encontrada es por que se están usando hash.

Era lógico usarlo porque todas las cabeceras tenían nombres distintos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @cabeceras = qw(
  2.     Pensiones   PBG     PBGVto  PBGMdo
  3.     Seguros     PIB     SBG     SBGVto  SBGMdo
  4. );
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
descartando, además, las filas 'Instrument' y 'Cash'.

Pero ahora tenemos una entrada, en la que las cabeceras pueden repetirse (caso de '>>MXP').

Entonces, lo del hash ya no nos vale. Hay que hacer un programa nuevo, y para eso, hay que saber las reglas que hay que implantar.

Por ejemplo, en el archivo de salida veo que se repiten en las primeras columnas el valor '-254237475.72611237 MXP'. ¿Por qué?
¿Qué diferencia la primera columna '>>MXP' de las siguientes?
¿De dónde sale la cabecera '>>NXP'?

Y así...
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

Publicidad

Re: Transponer y descartar campos

Notapor sufisavey80 » 2014-04-11 11:45 @531

Hola...

Respondiendo a tus preguntas:

El valor '-254237475.72611237 MXP'se repite ya que la cabecera Pensiones es un portafolio el cual puede contener Pesos (>>MXP), UDI (>>UDI) y Dólares (>>USD). Para este en ese día especifico de operación solo contiene Pesos (>>MXP), por lo cual,
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
         Pensiones      =  >>MXP         +          >>UDI  + >>USD
-254237475.72611237 MXP = -254237475.72611237 MXP  + 0 MXP   +  0 MXP
               PBG      =  >>MXP         +          >>UDI  + >>USD
-254237475.72611237 MXP = -254237475.72611237 MXP  + 0 MXP   +  0 MXP
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

un ejemplo de otro portafolio:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
           SEGPATR  =    >>MXP           +    >>UDI     +         >>USD
-71499.53219569 MXP = 27349.20982713 MXP + -2697.88878507 MXP + -96150.85323775 MXP
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Entonces el motivo de por qué se repite es por que para el portafolio (cabecera) PBG también solo contiene Pesos y opera la misma cantidad que el portafolio Pensiones y si notas el portafolio PBGMdo (cabecera) ya empiezan a diferir más, así como el portafolio Seguros uno operando UDIS (>>UDI) y el otro operando Pesos (>>MXP).

Para la segunda pregunta, lo que difiere es que el portafolio Pensiones debe tener su propia cantidad (detalle). Operada en este caso fue en Pesos al igual el portafolio PBG que contenga su propia cantidad operada, en este caso también fue solo en Pesos pero para esos días, ambos portafolios operaron la misma cantidad.

La tercer pregunta, la cabecera >>MXP es el detalle de cada portafolio (cabecera Pensiones, PBG, etc.) donde cada portafolio es el total, el cual el detalle también pudiera ser >>UDI o >>USD.

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

Re: Transponer y descartar campos

Notapor explorer » 2014-04-11 13:27 @602

¿Y por qué la primera línea del csv es un '>>MXP'? ¿A qué corresponde esos pesos? ¿Y qué hacemos con las líneas Instrument y Cash? ¿Las obviamos como antes?

Con la información que has dado, es complicado resolverlo.

Debes escribir todas las reglas que describen el formato del archivo de entrada.
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-11 15:50 @702

¿Qué tal?

La primera línea '>>MXP' en el archivo de entrada corresponde al detalle del portafolio (cabecera) Pensiones. Como solo opero pesos el total (Pensiones) es igual al detalle de la operación.

Espero que lo siguiente sea un poco más claro, las reglas a aplicar al archivo de entrada:

Reglas:
  1. Los detalles de las operaciones (>>MXP, >>UDI, >>USD) de cada portafolio (Pensiones,PBG, PBGVto, etc.) deben aparecer en el archivo de salida como cabeceras junto a su portafolio (total)
  2. Instrument y Cash, obviarlos como antes
  3. Portafolios (Pensiones,PBG, PBGVto, etc.) deben aparecer en el archivo de salida como cabeceras junto de sus detalles (>>MXP, >>UDI, >>USD) correspondientes
Nota: el orden o posición de las cabeceras en el archivo de salida para la regla 3 no es importante, es decir, las cabeceras pueden estar primero, los detalles y después el total (Portafolio) o primero el total (Portafolio) y después los detalles:

'>>MXP' 'Pensiones' '>>MXP' 'PBG'

o

'Pensiones' '>>MXP' 'PBG' '>>MXP'


Primer bloque del archivo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  SSHIST_2014-03-31_1 (0.002)   >>MXP   2014/03/31 (0)  -254237475.72611237 MXP  #Detalle del portafolio(en el archivo de salida como cabecera con sus respectivo valores)
  SSHIST_2014-03-31_1 (0.002)   Instrument      2014/03/31 (0)  -254237475.72611237 MXP #Obviarla como antes
  SSHIST_2014-03-31_1 (0.002)   Cash    2014/03/31 (0)  0 MXP                           #Obviarla como antes
  SSHIST_2014-03-31_1 (0.002)   Pensiones       2014/03/31 (0)  -254237475.72611237 MXP #Total (en archivo de salida como cabecera con sus respectivos valores)
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

y así para los demás bloques de cada fecha.

¡Gracias!
sufisavey80
Perlero nuevo
Perlero nuevo
 
Mensajes: 29
Registrado: 2012-11-07 18:17 @803

Re: Transponer y descartar campos

Notapor explorer » 2014-04-11 18:42 @821

Vale, lo entiendo más, pero hay más detalles sueltos...

En el primer día, del archivo de entrada, SBGMVida no tiene datos previos. Supongo que entonces, debemos tomar 0 como valor.

Otro: hay ocasiones en las que la suma está mal. Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
"  SSHIST_2014-03-31_1 (0.002)",>>MXP,"2014/03/31 (0)",1.82148522 MXP
"  SSHIST_2014-03-31_1 (0.002)",>>UDI,"2014/03/31 (0)",-263576.23037246 MXP
"  SSHIST_2014-03-31_1 (0.002)",PBGVOtro,"2014/03/31 (0)",-263574.40888721 MXP
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Si sumamos las cantidades de MXP y UDI, con una calculadora (o a mano), sale

-263574.40888724, que es distinto del total que aparece luego:
-263574.40888721

Según tu salida de ejemplo, no hay que hacer ninguna suma, y solo sacar los datos de los totales que estén en el archivo de entrada. ¿Ok?

Otro detalle importante: en la salida que pones, los portafolios son mayoritariamente MXP. Hay alguno MXP+UDI, y otro con las tres monedas. ¿Seguro que la salida es según la que has puesto en el archivo de salida? Porque, por ejemplo, Pensiones, solo tiene MXP. ¿No deberían aparecer dos columnas más con UDI y USD?

Por ejemplo, vemos que el portafolio SBGVVida tiene las tres monedas, en los tres días, pero en la salida, solo quieres que aparezcan las cabeceras '>>UDI' y '>>MXP'. ¿Eso es correcto?
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-14 09:18 @429

Muy buen día, explorer.

Respondiendo a tus comentarios:
  • Así es, para SBGMVida debemos tomar 0 como valor
  • En el caso de la cantidad -263574.40888721, tienes razón: muestra diferencias. En el archivo de entrada ya nos da el valor de Total (PBGVOtro) y detalles (>>UDI, >>MXP) por lo cual no es necesario calcularlo en el programa; solo imprimir los valores que ya contiene (entrada) en el archivo de salida
  • En el caso de Pensiones era solo como ejemplo el poner en cero UDI Y USD, pero para el archivo de salida mostrar solo lo que contenga el archivo de entrada, es decir para este caso (Pensiones) mostrar solo >>MXP
  • Para el caso de SBGVVida no es correcto, esto fue un error de dedo que cometí ya que como edité el archivo de salida a mano por error omití la moneda USD. Debería ser que salgan las tres monedas.

¡Gracias!
sufisavey80
Perlero nuevo
Perlero nuevo
 
Mensajes: 29
Registrado: 2012-11-07 18:17 @803

Re: Transponer y descartar campos

Notapor explorer » 2014-04-15 20:01 @876

Bueno, según lo indicado he encontrado una posible solución:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use autodie;
  4.  
  5. use Text::CSV;
  6.  
  7. ## Constantes y definiciones ################################################
  8. my $archivo = 'Rep_PnL_X_Mon_SP.csv';
  9. my @portafolios = (
  10.     [ 'Pensiones',      [ '>>MXP'                       ]],
  11.     [ 'PBG',            [ '>>MXP'                       ]],
  12.     [ 'PBGVto',         [ '>>MXP'                       ]],
  13.     [ 'PBGMdo',         [ '>>UDI'                       ]],
  14.     [ 'Seguros',        [ '>>MXP'                       ]],
  15.     [ 'PIB',            [ '>>MXP'                       ]],
  16.     [ 'SBG',            [ '>>MXP'                       ]],
  17.     [ 'SBGVto',         [ '>>MXP'                       ]],
  18.     [ 'SBGMdo',         [ '>>MXP'                       ]],
  19.     [ 'SBGMNoVida',     [ '>>MXP'                       ]],
  20.     [ 'SBGMVida',       [                               ]],
  21.     [ 'PBGVOtro',       [ '>>UDI', '>>MXP'              ]],
  22.     [ 'PBGVRva',        [ '>>UDI', '>>MXP'              ]],
  23.     [ 'SBGVVida',       [ '>>USD', '>>UDI', '>>MXP'     ]],
  24.     [ 'SBGVNoVida',     [ '>>USD', '>>UDI', '>>MXP'     ]],
  25.     [ 'SEGPATR',        [ '>>USD', '>>UDI', '>>MXP'     ]],
  26.     [ 'SEGPAVC',        [ '>>UDI', '>>MXP'              ]],
  27.     [ 'SEGPAVE',        [ '>>UDI', '>>MXP'              ]],
  28.     [ 'SEGPAVM',        [ '>>UDI', '>>MXP'              ]],
  29.     [ 'SEGPAS',         [ '>>UDI', '>>MXP'              ]],
  30.     [ 'SEGCREC',        [                               ]],
  31. );
  32. my @cabeceras;
  33. for my $portafolio_ref (@portafolios) {
  34.     push @cabeceras, $portafolio_ref->[0];
  35.    
  36.     my @monedas = @{$portafolio_ref->[1]};
  37.  
  38.     if (@monedas) {
  39.         push @cabeceras, @monedas;
  40.     }
  41. }
  42.  
  43.  
  44. ## Lectura ##################################################################
  45. my @filas;
  46. my $csv = Text::CSV->new()
  47.     or die "ERROR: No puedo usar CSV: " . Text::CSV->error_diag(). "\n";
  48.  
  49. open my $fh, '<:crlf', $archivo;
  50. while (my $fila = $csv->getline($fh)) {
  51.     next if $fila->[1] eq 'Instrument'
  52.          or $fila->[1] eq 'Cash'
  53.          ;
  54.          
  55.     push @filas, $fila;
  56. }
  57.  
  58. $csv->eof or $csv->error_diag();                # cerramos el csv
  59. close $fh;
  60.  
  61.  
  62. ## Proceso ##################################################################
  63. say "Reporte: $archivo";
  64.  
  65. say join ',', ('') x @cabeceras;                # líneas sin datos
  66. say join ',', ('') x @cabeceras;
  67.  
  68. say join ',', @cabeceras;                       # cabeceras
  69.  
  70. my $fecha_actual = $filas[0][0];                # primera fecha de la entrada
  71. my %monedas;                                    # valores de las monedas, por cada portafolio
  72. my %portafolios;                                # almacén de los portafolios que vamos leyendo para una fecha
  73.  
  74. for my $fila (@filas) {                         # para todas las filas
  75.     my @campos = @$fila;                        # campos de esa fila
  76.    
  77.     if ($fecha_actual ne $campos[0]) {          # hay cambio de fecha
  78.         saca_portafolio();                      # sacamos los portafolios de la fecha anterior
  79.         $fecha_actual  = $campos[0];            # recordamos la nueva fecha
  80.     }
  81.    
  82.     if ($campos[1] =~ /^>>/) {                  # si lo leído es una moneda
  83.         $monedas{$campos[1]} = $campos[3];      # guardamos su valor
  84.     }
  85.     else {                                      # si no lo es, es el valor de un portafolio
  86.                                                 # guardamos las monedas leídas junto con el portafolio y el total
  87.         $portafolios{$campos[1]} = { %monedas, total => $campos[3] };
  88.  
  89.         %monedas = ();                          # vaciamos el monedero, para el siguiente portafolio
  90.     }
  91. }
  92.  
  93. saca_portafolio();                              # sacar la última fecha pendiente del archivo de entrada
  94.  
  95. sub saca_portafolio {
  96.     my @nueva_linea;
  97.     push @nueva_linea, $fecha_actual;
  98.    
  99.     for my $portafolio (@portafolios) {         # por cada portafolio
  100.         my $nombre = $portafolio->[0];
  101.                                                 # primero sacamos el total
  102.         push @nueva_linea, $portafolios{$nombre}{total};
  103.        
  104.         for my $moneda (@{$portafolio->[1]}) {  # y luego las monedas, en el orden indicado al principio del programa
  105.             push @nueva_linea, $portafolios{$nombre}{$moneda};
  106.         }
  107.     }
  108.    
  109.     say join ',', @nueva_linea;                 # separados por comas
  110. }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
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-16 11:22 @515

¡Muchas gracias, explorer! Deja que realice las pruebas y te comento los resultados. Excelente como siempre.
sufisavey80
Perlero nuevo
Perlero nuevo
 
Mensajes: 29
Registrado: 2012-11-07 18:17 @803

Re: Transponer y descartar campos

Notapor sufisavey80 » 2014-05-05 10:39 @485

¿Qué tal, explorer?

¿Sabes de dónde puedo descargar la librería Text::CSV para la versión "This is perl, v5.8.4 built for sun4-solaris-64int" que estoy utilizando, ya que me arroja el siguiente mensaje:

Can't locate Text/CSV.pm

¡Gracias y buen día!
sufisavey80
Perlero nuevo
Perlero nuevo
 
Mensajes: 29
Registrado: 2012-11-07 18:17 @803

Re: Transponer y descartar campos

Notapor explorer » 2014-05-05 12:52 @577

Para Solaris, con el antiquísimo Perl v5.8.4... me sale que nadie la ha probado :)

Bueno, sí que está probada la versión v1.18 de Text::CSV.

Para instalar un módulo en Perl, debes seguir el procedimiento indicado en el hilo Instalación de módulos y bibliotecas en Perl. Como estás en Solaris, la explicación más cercana es la de cómo instalar módulos en Linux.

Resumen: (opción 1 de la instalación) prueba primero utilizando el gestor de paquetes de Solaris, a ver si tienes la suerte de que Text-CSV esté empaquetado de esa forma. Se podrá llamar text-csv-perl, perl-text-csv, libtext-csv-perl, o algo parecido. Busca por text-csv.

Si no está, pues entonces debes probar a instalarlo con el comando cpan (opción 2 de la instalación).

Y si aún así no puedes instalarlo, tendrás que conectarte a su página, bajarte el archivo, y seguir las instrucciones de instalación indicadas en el README (opción 3).
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

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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

cron