• Publicidad

Significado de un código

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

Significado de un código

Notapor decaro6802 » 2010-04-10 19:01 @834

Hola, buenas tardes. ¿Alguien me puede ayudar a traducir este código por favor?
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while (<>) {
  2.     if (/^\d/) {
  3.         chomp; chomp;
  4.         (@f) = split;
  5.         for $i (3,4,5) { $f[$i] =~ s|\$||g; $f[$i] =~ s|,||g; }
  6.         printf ("   %02d %03d %-8s%22s%20s%21s%8d%4s %02d %-4s    %-8s   %2s      %8s %06d*\n", @f);
  7.     }
  8. }
  9.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
decaro6802
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2010-04-10 18:45 @823

Publicidad

Re: Significado de un código

Notapor explorer » 2010-04-10 19:17 @845

Bienvenido a los foros de Perl en Español, decaro6802.

El código hace lo siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while (<>) {              # Para todas las líneas del fichero pasado en la entrada estándar
    if (/^\d/) {                # Si la línea comienza con un número,
        chomp; chomp;           # Le quitamos los caracteres de fin de línea (¿dos veces?)

        (@f) = split;           # Dividimos la línea en campos,
                                # separándolos por los espacios en blanco

        for $i (3,4,5) {        # Recorremos los campos 3 a 5
            $f[$i] =~ s|\$||g;  # Le quitamos todos los caracteres '$' al campo
            $f[$i] =~ s|,||g;   # Le quitamos todas las comas al campo
        }

        # Sacamos por la salida estándar todos los campos, formateados
        printf ("   %02d %03d %-8s%22s%20s%21s%8d%4s %02d %-4s    %-8s   %2s      %8s %06d*\n", @f);
    }
}
 
Coloreado en 0.001 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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Aprendiendo perl

Notapor decaro6802 » 2010-04-10 20:10 @882

Este programa sirve para leer la siguiente información:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Estado de Cuenta de Saldo Neto de Efectivo

Jueves, 13 de Noviembre de 2008 | 16:27:58
Institución:01 001 CATAL01

                            Agente                      Contraparte              Clave de valor                                                                          

Agrupación Id  Folio      Institución      Cuenta   Id  Folio   Cuenta   T.V.  Emisora   Serie     Cupón    Origen  Aplicación  Mercado  Movimiento   Cuenta  Fecha de Oper
CRONOLOGIC 01   001        CATAL01                                                                                                                             13-Nov-2008

          Contraparte                   Cobros                   Pagos                    Saldo             Folio    ME    OR    Movto    Aplica   Cuenta     Hora     Folio Original   Cuenta    T.V.     Emisora    Serie     Cupón           Títulos                   Precio          Plazo     %  
02 014 CATAL01                          $998,713,923.12                    $0.00          $998,713,923.12    86      PG    02     RSP    RSPBT      MD      08:40:18       08030         6620      IS      BPA182    140612     0000                   9,838,694            $101.50879000   0       0.00
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Sin embargo con la siguiente información no genera nada. ¿Qué tengo que hacer?

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Estado de Cuenta Operativo de Efectivo

Lunes, 30 de Noviembre de 2009 | 12:38:54

Institucion : 01  001 PRUEBA NUEVO FORMATO
                           
      Cuenta          Naturaleza        Institución     Tipo de Cuenta     Fecha Inicial      Fecha Final         Divisa            Bóveda      
     010012000          PASIVO             01001           NOMBRADA         27/11/2009        27/11/2009       Mexican Peso          TODAS      
Registros Encontra
        279      
      Divisa         Mexican Peso  
                                   
               Bóveda               Saldo Disponible Saldo No disponibl   Saldo Inicial  
     BOVEDA DE EFECTIVO                  $ 0.00            $ 0.00            $ 0.00      
      Fecha Liquidación                         Descripción                   Cuenta Contraparte    Contraparte    Folio Instrucción Tipo Instrucción        Cobro             Pago           Disponible       No Disponible         Saldo      
   2009-11-27 07:48:13.000                     ABONO POR DVP                     (02-045-2000)        CATAL01           5442308            VREP         $313,782,295.29                    $ 313,782,295.29       $ 0.00       $ 313,782,295.29
   2009-11-27 07:48:13.000                     CARGO POR DVP                     (02-013-2000)        CATAL02           5442520            VREP                           $ 8,000,959.36   $ 305,781,335.93       $ 0.00       $ 305,781,335.93
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
decaro6802
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2010-04-10 18:45 @823

Re: Significado de un código

Notapor explorer » 2010-04-10 21:13 @926

En el primer ejemplo, hay una línea que comienza por números, que es el tipo de líneas que el programa busca. Por cada una de ellas, coge los valores de Cobro, Pago y Saldo, les quita el símbolo del '$' y las comas, y saca la línea con los nuevos campos (y no todos, además).

La salida es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
   02 014 CATAL01           998713923.12                0.00         998713923.12      86  PG 02 RSP     RSPBT      MD      08:40:18 008030*
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


El problema del segundo ejemplo es que las entradas que te interesa sacar... no empiezan por número, sino por espacios en blanco, seguidos de una fecha. Y un problema más grave es que ya no puedes dividir las líneas por espacios en blanco, ya que hay campos que tienen espacios dentro de ellos, como por ejemplo, la descripción.

Si supiéramos que, por ejemplo, los campos se separan con el carácter tabulador, entonces sí que es fácil separarlos.

Debes modificar el programa para que coincida con el patrón que represente a estas nuevas líneas.

Por ejemplo, con el siguiente programa
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. while (<>) {              # Para todas las líneas del fichero pasado en la entrada estándar
  4.  
  5.     if (/^\s+\d{4}-/) {   # Si la línea comienza con un fecha,
  6.  
  7.         (@dinero) = $_ =~ /\$ ?([\d,.]+)/g;     # Extraemos los campos con aspecto monetario
  8.  
  9.         map { s/,//g; } @dinero;                # Les quitamos las comas
  10.  
  11.         print "@dinero\n";                      # Y los imprimimos
  12.     }
  13. }
  14.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

sale
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
313782295.29 313782295.29 0.00 313782295.29
8000959.36 305781335.93 0.00 305781335.93
Coloreado en 0.000 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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Significado de un código

Notapor decaro6802 » 2010-04-10 21:38 @943

Pero si deseo toda la información seleccionada en columnas ¿sería la misma instrucción...?
decaro6802
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2010-04-10 18:45 @823

Re: Significado de un código

Notapor explorer » 2010-04-11 06:54 @329

Primero, debes resolver lo que significa "columnas".

En la primera entrada, es fácil decir lo que son las "columnas": están separadas unas de otras por caracteres en blanco.

Pero, en la segunda entrada, ¿qué es lo que define a una "columna"? ¿qué es lo que la diferencia de las demás? ¿su posición? ¿o tiene separadores?

Por lo que veo, creo que se trata del caso de posiciones fijas. Entonces, podrías usar la función unpack() para extraer las columnas.

Y luego, el resto del programa es muy parecido a lo mostrado: formatear las cifras y sacar las nuevas líneas con un formateo hecho con printf().

Ejemplo. Si las columnas están en posiciones fijas, podemos construir este programa para leerlas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. while (<>) {              # Para todas las líneas del fichero pasado en la entrada estándar
  4.  
  5.     if (/^\s+\d{4}-/) {   # Si la línea comienza con un fecha,
  6.         chomp;
  7.  
  8. #      Fecha Liquidación                         Descripción                   Cuenta Contraparte    Contraparte    Folio Instrucción Tipo Instrucción        Cobro             Pago           Disponible       No Disponible         Saldo      
  9. #   2009-11-27 07:48:13.000                     ABONO POR DVP                     (02-045-2000)        CATAL01           5442308            VREP         $313,782,295.29                    $ 313,782,295.29       $ 0.00       $ 313,782,295.29
  10. #1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
  11. #0        1         2         3         4         5         6         7         8         9        10        11        12        13        14        15        16        17        18        19        20        21        22        23        24        25
  12.  
  13.         @dinero = unpack 'a30 a48 a19 a19 a15 a20 (a18)5';  # Extraemos las columnas
  14.  
  15.         @dinero = map { "[$_]" } @dinero;                   # Les ponemos delimitadores
  16.  
  17.         print "@dinero\n";                                  # Y los imprimimos
  18.     }
  19. }
  20.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. [   2009-11-27 07:48:13.000    ] [                 ABONO POR DVP                  ] [   (02-045-2000)   ] [     CATAL01       ] [    5442308    ] [        VREP        ] [ $313,782,295.29  ] [                  ] [$ 313,782,295.29  ] [     $ 0.00       ] [$ 313,782,295.29  ]
  2. [   2009-11-27 07:48:13.000    ] [                 CARGO POR DVP                  ] [   (02-013-2000)   ] [     CATAL02       ] [    5442520    ] [        VREP        ] [                  ] [ $ 8,000,959.36   ] [$ 305,781,335.93  ] [     $ 0.00       ] [$ 305,781,335.93  ]
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Vemos que hemos capturado bien las columnas. Ahora es fácil filtrar las correspondientes a los números. Y ya solo queda imprimir los campos que queramos. Seguramente, antes, habrá que eliminar los caracteres en blanco que rodean a los campos. Todo depende del resultado que quieras obtener.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Significado de un código

Notapor decaro6802 » 2010-04-11 11:58 @540

Ok, te lo agradezco mucho. Gracias.
decaro6802
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2010-04-10 18:45 @823

Re: Significado de un código

Notapor decaro6802 » 2010-04-15 13:18 @596

Hola, siguiendo con el ejemplo de extraer los campos que tengan "$", ¿cómo le puedo asignar un valor de salida fijo? Ejemplo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
#      Fecha Liquidación                         Descripción                   Cuenta Contraparte    Contraparte    Folio Instrucción Tipo Instrucción        Cobro             Pago           Disponible       No Disponible         Saldo      
#   2009-11-27 07:48:13.000                     ABONO POR DVP                     (02-045-2000)        CATAL01           5442308            VREP         $313,782,295.29                    $ 782,295.29       $ 0.00       $ 999,313,782,295.29
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Si ves la información los últimos campos pueden ser variables y yo quiero dejarlos con longitud fija cada uno. ¿Cómo le puedo hacer?
decaro6802
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2010-04-10 18:45 @823

Re: Significado de un código

Notapor explorer » 2010-04-15 13:32 @605

Si eres capaz de leer los campos (como hemos hecho en el anterior mensaje), ahora es fácil sacarlos en el tamaño que quieras. Con la función printf() o sprintf() puedes sacar números formateados dentro de un determinado ancho.

Actualización: Hay un posible problema: que el fichero de entrada saque esos 4 campos de una forma distinta en cada línea. Si, suponemos, que el ancho de los campos depende de las cantidades, podríamos tener que cada línea tuviera un ancho de campos distinto.

¿No puedes influir en el formato del fichero de entrada? Si consiguieras que los campos estuvieran separados con tabuladores -por ejemplo-, lo tendrías mucho más fácil.

Actualización 2: con la expresión regular de un mensaje anterior, es posible sacar las cuatro cifras, pero no podríamos saber -al menos de forma fácil- si la primera cifra corresponde a un cobro o a un pago. ¿No puedes publicar ejemplos de ficheros de entradas con distintos tamaños de cifras? Sigo diciendo que la clave está en el formato del fichero de entrada, que es horrible.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Significado de un código

Notapor decaro6802 » 2010-04-15 14:12 @633

De hecho ya tengo solucionado el problema de emitir las últimas cuatro columnas, pero el problema es que en el archivo de salida debo dejar estos cuatro campos con longitud fija. Como comentas el archivo está horrible. Te agrego el programa y el resultado.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while (<>) {

    if (/^\s+\d{4}-/) {
       chomp;
       @Fecha = substr($_,3,10);
       @Hora = substr($_,14,8);
       @Esp = substr($_,22,4);
       @Desc = substr($_,31,50);
       @Cta = substr($_,82,11);
       @Contrato = substr($_,101,8);
       @Folio = substr($_,117,12);
       @TipInst = substr($_,139,4);
       (@Dinero) = $_ =~ /\$ ?([\d,.]+)/g;
       map { s/,//g; } @Dinero;
       @Ast = "*";
       @RegSal= "@Fecha@Hora@Esp@Cta@Contrato@Folio@TipInst@Dinero@Ast";
       printf ("%10s%8s%4s%11s%8s%12s%4s%22s%22s%22s%22s%1s\n", @RegSal);
  }
}
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero las últimas 4 columnas me las deja variables:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
2009-11-2707:48:13.00002-045-2000 CATALO    5442308  VREP313782295.29 313782295.29 0.00 313782295.29*
2009-11-2707:48:13.00002-013-2000PRUEBA    5442520  VREP8000959.36 305781335.93 0.00 305781335.93*
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

¿Si se podrá lo que yo quiero?
decaro6802
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2010-04-10 18:45 @823

Siguiente

Volver a Básico

¿Quién está conectado?

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