Yo he encontrado una manera, aunque no sé si es muy complicada... consiste en ir leyendo el archivo, e ir guardando la información en una estructura tridimensional
Using perl Syntax Highlighting
#!/usr/bin/perl
use v5.14;
use autodie;
my %datos;
open my $IN, '<', 'code_35386.txt';
my $cabecera = <$IN>; # leemos la cabecera para
my $numero_campos = 1 + ($cabecera =~ tr/\t/\t/); # saber el número de columnas
#say $numero_campos;
#$" = "|";
while (<$IN>) { # leemos el resto de líneas
chomp;
my @campos = split /\t/;
# say "@campos";
for (my $i = 1; $i < $numero_campos; $i++) { # para todas las columnas posibles
if (not defined $campos[$i]) { # para el caso de columnas al final de la línea
$campos[$i] = ''; # si no están definidas, las ponemos como cadenas vacías
}
$datos{ $campos[0] }[$i]{$campos[$i]} = 1; # guardamos la información
}
}
close $IN;
#use Data::Dumper;
#say Dumper \%datos;
print $cabecera; # salida: sacamos la cabecera original
for my $key (sort keys %datos) { # para todas las claves encontradas
my @fila = $key; # vamos a construir la nueva línea
for (my $i = 1; $i < $numero_campos; $i++) { # para todas las columnas posibles
push @fila, join(',', keys %{$datos{$key}[$i]}); # sacamos todos los valores unidos por ','
}
say join "\t", @fila; # sacamos toda la fila, uniendo las columnas con "\t"
}
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
La estructura tridimensional tiene, en su primera dimensión, el valor de la primera columna, que suponemos que debe ser único (agrupar filas). La segunda dimensión es un índice que recorre el resto de columnas. Y la tercera dimensión es un
hash, que recuerda qué valores han salido (según el valor de la primera columna y de la columna en que nos encontremos).
El uso de un
array para las columnas nos facilita recorrerlas de forma consecutiva. Y el uso de un
hash nos sirve tanto para recordar lo que ha salido, como para simplificar los datos repetidos.
El bucle de la 39 a la 49 puede reducirse a esto, aumentando un poco más la velocidad:
Using perl Syntax Highlighting
for my $key (sort keys %datos) { # para todas las claves encontradas
# sacamos toda la fila, uniendo las columnas con "\t", y cada columna tiene sus valores unidos con ','
say join "\t", $key, map { join(',', keys %{$datos{$key}[$_]}) } 1 .. $numero_campos-1;
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4