Bueno, el caso es que es fácil la solución, pero requiere pensar un poco en cómo organizar los datos que se van leyendo.
Lo normal es leer todo el fichero, primero, para crear un
hash en donde guardaremos la información de cada nodo.
Luego, recorremos todas las claves mientras tengamos cambios en el árbol que vamos a construir.
La construcción del árbol se basa en recorrer de forma recursiva siguiendo los enlaces, destruyendo nodos a medida de que los vamos enlazando con los demás.
Otra forma de hacerlo... es usar una librería ya hecha
Supongamos que tenemos este fichero de entrada:
Using text Syntax Highlighting
id descripcion pcelementobalanceid
T1 titulo1 0
C1 capitulo1 T1
C2 capitulo2 T1
G1 grupo1 C1
G2 grupo2 C1
S1 subgrupo1 G1
S2 subgrupo2 G2
PCORUS1 pcorus1 S1
PCORUS2 pcorus2 S2
G3 grupo3 C2
PCORUS3 pcorus3 G3
T2 titulo2 0
C3 capitulo3 T2
G4 grupo4 C3
PCORUS4 pcorus4 G4
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Entonces, con este programa:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use Tree::Numbered::Tools;
#use Data::Dumper;
my @array;
my %hash;
open my $fichero, '<kk.txt';
<$fichero>;
push @array, [1, 0, 'ROOT', 'ROOT'];
$hash{0} = [1, 0, 'ROOT', 'ROOT'];
my $numero_nodo = 2;
while (<$fichero>) {
chomp;
my ($id, $descripcion, $padre) = split " ";
$hash{$id} = [$numero_nodo++, $descripcion, $padre];
}
#print Dumper \%hash;
#print "=" x 40, "\n";
for my $id (keys %hash) {
next if $id eq '0';
push @array, [ $hash{$id}[0], $hash{$hash{$id}[-1]}[0], $hash{$id}[1] ];
}
close $fichero;
#print Dumper \@array;
my $tree = Tree::Numbered::Tools->readArray(
arrayref => \@array,
use_column_names => 0,
);
# Pintar el árbol
foreach ($tree->listChildNumbers) {
print $_, " ", join(' -- ', $tree->follow($_,"Value")), "\n";
}
__END__
Coloreado en 0.004 segundos, usando
GeSHi 1.0.8.4
obtenemos esta salida:
Using text Syntax Highlighting
2 titulo1
4 titulo1 -- capitulo1
6 titulo1 -- capitulo1 -- grupo1
9 titulo1 -- capitulo1 -- grupo1 -- subgrupo1
11 titulo1 -- capitulo1 -- grupo1 -- subgrupo1 -- pcorus1
7 titulo1 -- capitulo1 -- grupo2
10 titulo1 -- capitulo1 -- grupo2 -- subgrupo2
12 titulo1 -- capitulo1 -- grupo2 -- subgrupo2 -- pcorus2
5 titulo1 -- capitulo2
8 titulo1 -- capitulo2 -- grupo3
13 titulo1 -- capitulo2 -- grupo3 -- pcorus3
3 titulo2
14 titulo2 -- capitulo3
15 titulo2 -- capitulo3 -- grupo4
16 titulo2 -- capitulo3 -- grupo4 -- pcorus4
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
que ya es fácilmente trasladable a una estructura en forma de tabla. Solo hay que traducir el número de hijos en cada nodo por el número de celda que tenemos que escribir.
Aquí usamos
Tree::Numbered::Tools para la creación del árbol. Pero hay que hacer un trabajo previo porque el formato de entrada no es como lo espera el módulo.
Incluso se puede usar algún módulo como
Data::Format::HTML o
Data::Table para generar el HTML final.