• Publicidad

Formatear Archivo por longitud de campos

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

Formatear Archivo por longitud de campos

Notapor decaro6802 » 2011-06-08 19:27 @852

Hola Buenas Tardes:

Realicé un programa Perl para formatearlo por posiciones, pero la salida del archivo me deja blancos. Anexo programa:

while (my $linea = <>) {
chomp;
$Nombre = substr($_, 1, 255);
$SegNom = substr($_,256, 50);
$PriNom = substr($_,306, 50);
$Categor = substr($_,356, 20);
$SubCate = substr($_,376, 20);
$Pais = substr($_,396,100);
$FecNac = substr($_,496, 75);
$Otros = substr($_,571,430);
$Ast = ('*');
printf ("%255s%50s%50s%20s%20s%100s%75s%430s\n",
$Nombre, $SegNom, $PriNom, $Categor, $SubCate, $Pais,
$FecNac, $Otros, $Ast);
}
decaro6802
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2010-04-10 18:45 @823

Publicidad

Re: Formatear Archivo por longitud de campos

Notapor explorer » 2011-06-09 01:21 @097

Los números que hay delante de las 's' en el printf() indican el tamaño del campo. Si el escalar que vamos a sacar en esa posición tiene menos longitud que ese tamaño de campo, printf() lo rellenará de blancos.

Quizás sea posible resolver este problema de otra manera más sencilla, si nos dices exactamente qué quieres hacer.
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: Formatear Archivo por longitud de campos

Notapor decaro6802 » 2011-06-09 10:59 @499

Ok, me van a mandar un archivo de longitud fija. Su layout es el siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
01 WS-MP.                                            
    05 WS-WLCOMP-NOMBRE        PIC X(255).            
    05 WS-WLCOMP-SEG-NOM       PIC X(50).            
    05 WS-WLCOMP-PRI-NOM       PIC X(50).            
    05 WS-WLCOMP-CATEGOR       PIC X(20).            
    05 WS-WLCOMP-SBCATEG       PIC X(20).            
    05 WS-WLCOMP-PAIS          PIC X(100).            
    05 WS-WLCOMP-FEC-NAC       PIC X(75).            
    05 WS-WLCOMP-OTROS         PIC X(430).
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Yo necesito formatearlo para dejarlo en otro archivo, para otro aplicativo, de la misma longitud y poder dar de alta esta información. Según hasta donde yo tengo entendido todos los registros deben de venir así como el layout. ¿Qué pasa si en el archivo algunos registros vienen truncos y no cumplen con el layout, por eso será que me genera el archivo en blanco? O si llegara a llegar así el archivo ¿cómo puedo eliminar estos registros truncos...? Voy anexar archivo de algunos registros.
decaro6802
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2010-04-10 18:45 @823

Re: Formatear Archivo por longitud de campos

Notapor explorer » 2011-06-09 16:15 @719

De acuerdo... entonces, cuando dices "me deja algunos blancos", ¿a qué te refieres?

Una cosa importante... El índice de caracteres dentro de una cadena, se basa en 0, por lo que

$Nombre = substr($_, 1, 255);

no es correcto. El primer campo debe empezar en 0:

$Nombre = substr($_, 0, 255);

Y lo mismo para el resto de posiciones: debes restarle uno a todas.

Quizás esta sea la causa de los "blancos".
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: Formatear Archivo por longitud de campos

Notapor decaro6802 » 2011-06-09 18:58 @832

Ya realicé los cambios como mencionas pero me sigue dejando el archivo de salida en blanco, lo que pasa que en este archivo vienen registros truncados, no sé si sea el motivo de que el archivo de salida no me esté dejando información. Anexo los cambios realizados:
while (my $linea = <>) {
chomp;
$Nombre = substr($_, 0, 255);
$SegNom = substr($_,255, 50);
$PriNom = substr($_,305, 50);
$Categor = substr($_,355, 20);
$SubCate = substr($_,375, 20);
$Pais = substr($_,395,100);
$FecNac = substr($_,495, 75);
$Otros = substr($_,570,430);
$Ast = ('*');
printf ("%255s%50s%50s%20s%20s%100s%75s%430s\n",
$Nombre, $SegNom, $PriNom, $Categor, $SubCate, $Pais,
$FecNac, $Otros, $Ast);
}

"cltXXX1.plHIL_N120495" 35 lines, 1449 characters
SACBUR_D$ ./cltXXX1.plHIL_N120495 prueba01.txt > prueba.txt
SACBUR_D$ more prueba.txt























prueba.txt (0%)
decaro6802
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2010-04-10 18:45 @823

Re: Formatear Archivo por longitud de campos

Notapor explorer » 2011-06-10 01:47 @116

Ya encontré el problema :)

En la línea del while(), estás leyendo desde la entrada estándar una línea cada vez, y la guardas en la variable $linea. Pero... resulta que estás extrayendo la información de $_... y $_ *no* está almacenando el valor de la línea.

Debes hacer el siguiente cambio. Esto:

while (my $linea = <>) {

por esto:

while (<>) {

Y ahora sí: la línea que estás leyendo se guardará en $_.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while (<>) {
  2.     chomp;
  3.     $Nombre  = substr($_, 0, 255);
  4.     $SegNom  = substr($_,255, 50);
  5.     $PriNom  = substr($_,305, 50);
  6.     $Categor = substr($_,355, 20);
  7.     $SubCate = substr($_,375, 20);
  8.     $Pais    = substr($_,395,100);
  9.     $FecNac  = substr($_,495, 75);
  10.     $Otros   = substr($_,570,430);
  11.     $Ast     = '*';
  12.     printf ("%255s%50s%50s%20s%20s%100s%75s%430s\n",
  13.             $Nombre, $SegNom, $PriNom, $Categor, $SubCate, $Pais, $FecNac, $Otros, $Ast
  14.     );
  15. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Y ahora veo dos problemas más...
* La partición no tiene sentido porque luego los vuelves a juntar en el printf()
* La variable $Ast no está saliendo, porque no está indicando en la cadena de formato de printf()

Yo sospecho que lo que quieres hacer es añadir un '*' al final de cada línea. En ese caso, quedaría el código así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while (my $linea = <>) {
  2.     chomp $linea;
  3.     print $linea, ' *', "\n";
  4. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
(En este ejemplo he cambiado el $_ por $linea, pero es lo mismo que antes.)
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


Volver a Básico

¿Quién está conectado?

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

cron