• Publicidad

Crear archivo usando solo algunos datos de otro archivo

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

Crear archivo usando solo algunos datos de otro archivo

Notapor taker23 » 2011-12-06 18:33 @814

Hola a todos, soy nuevo en el foro y también usando este genial lenguaje llamado Perl. Ya he creado algunos scripts para crear archivos a partir de otros pero ahora me encuentro con otro problema. A continuación lo explico:

Tengo el archivo de entrada que tiene datos más o menos así:

BOARD,12345,ABDCE,1/1|2/2|3/3,1AB2

Y necesito que el archivo de salida sea así:

12345,ABDCE,1/1,1AB2
12345,ABDCE,2/2,1AB2
12345,ABDCE,3/3,1AB2


Cabe mencionar que la cadena de datos que está separada por | no siempre tiene la misma cantidad de caracteres: puede ir desde 1/1 hasta 14/14.

¿Alguien sabe si hay alguna manera de hacer un script en Perl para hacer esto?

Gracias de antemano.

Saludos
taker23
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2011-12-06 18:01 @792

Publicidad

Re: Crear archivo usando solo algunos datos de otro archivo

Notapor explorer » 2011-12-06 18:59 @833

Bienvenido a los foros de Perl en español, taker23.

¿No tienes algún código que hayas probado con esto y nos lo puedas presentar?
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: Crear archivo usando solo algunos datos de otro archivo

Notapor taker23 » 2011-12-06 19:23 @849

Este es el código que tenía pensado usar basado en un par de scripts que ya me funcionaron:

#!/usr/bin/perl
open (FI, '<original.txt') or die;
$r = 0;
open (FO, '>arreglado.txt') or die;
$w = 0;
while (<FI>) {
$r += 1;
chomp;
# ($const, $cdc, $isn, $tail)
($campo1, $campo2, $campo3, $campo4, $campo5) = split('\,');

printf FO "%05d,%05d,%05d,????,%04d\n",$campo1,$campo2,$campo3,$campo4,$campo5";
$w++;

}
close (FI);
close (FO);
exit;

La cuestión es que en $campo4, el cual marco, es donde está el valor que quiero desglosar en varios registros donde solo ese valor sea cambiante... Y, pues la verdad, no sé cómo definirlo...
taker23
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2011-12-06 18:01 @792

Re: Crear archivo usando solo algunos datos de otro archivo

Notapor explorer » 2011-12-06 19:54 @870

Solo tienes que insertar una línea más, justo antes del print(), para que 'parta' $campo4, igual que usas el split() un par de líneas más arriba, pero usando '\|' como separador.

Luego, tienes que hacer un bucle que recorra todos los valores extraídos. Algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     @valores = split /\|/, $campo4;
  2.     for $valor (@valores) {
  3.         print FO "$campo1,$campo2,$campo3,$valor,$campo5\n";
  4.     }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

El caso es que es un problema muy sencillo. De hecho, ni siquiera te hace falta hacer ningún programa.
Ejecutando lo siguiente, en la misma línea de comandos, te servirá.
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -nlaF, -E 'print "$F[1],$F2],$_,$F[4]" for split/\|/,$F[3]' original.txt > arreglado.txt
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

Aquí, usamos
  • -n para que abra el fichero de entrada y haga un bucle por todas las filas, pero sin imprimirlas (no nos interesan las líneas originales, solo las generadas por nosotros)
  • -l para que quite los caracteres de fin de línea en la entrada, y los ponga en la salida (por si acaso)
  • -a para que 'parta' cada línea
  • -F, (atento a la coma) para que la partición sea por las comas. El resultado queda en @F
  • -E ejecuta el mini-programa que sigue a continuación, que hace:
    • split() del campo $F[3], usando '|' como separador, dando una lista de valores
    • esa lista es recorrida por el bucle for(), que va poniendo cada valor en $_
    • por cada valor, hacemos un print()
    • lo que sacamos fuera es la unión de los campos, con comas junto con $_
Finalmente, usamos '>' del shell, para que redirija la salida del mini-programa Perl al fichero resultado.

Vamos, que estamos haciendo las mismas operaciones de antes, pero aprovechando las características de las opciones o switch que se pueden poner a perl en la línea de comandos (más información en perlrun).
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


Volver a Básico

¿Quién está conectado?

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

cron