Había problemas en el código: Faltaba un paréntesis, no se cerraba $FORMAT_DO, la presencia de un '|' inicial en el archivo de entrada obliga a renumerar las columnas una posición más.
Pero el problema principal estaba en el split(): hay que recordar que el primer argumento de split() es el delimitador, que es un patrón de expresiones regulares, no una cadena de caracteres, así que "|" realmente es un patrón. Y en un patrón, el carácter '|' sí que tiene un significado: es el de alternancia. Por eso no se realizaba bien la partición de las columnas.
La solución es indicar que el carácter '|' realmente no es alternancia, sino un carácter normal.
Esta es la versión corregida:
Using perl Syntax Highlighting
#!/usr/bin/env perl
use strict;
use warnings;
use autodie;
use feature 'say';
my $archivo_fuente = "code_38870.txt";
my $archivo_salida = "code_38870.csv";
# deviceID insertiontime row_index
my @columnas = (1, 5, 8, );
open my $FORMAT_FONT, '<', $archivo_fuente;
open my $FORMAT_DO, '>', $archivo_salida;
my $i = 0;
while (my $registro = <$FORMAT_FONT>) {
next if $registro !~ m/^ [|] \s* \d+/x; # saltamos a la siguiente línea si no es un registro
chomp $registro ;
my @campos = split /\s*[|]\s*/, $registro; # extraemos @campos
say $FORMAT_DO join ',', @campos[@columnas]; # y sacamos de @campos las @columnas que nos interesan
$i++;
}
close $FORMAT_FONT;
close $FORMAT_DO;
say "\n\tOperación realizada con éxito: $i registros procesados del archivo $archivo_salida.";
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Más información en
perldoc -f split