Build Tree ::来自文件数据的简单对象

时间:2012-07-16 13:59:34

标签: perl tree

有没有人有使用Tree::Simple或将数据放入Perl中的树的经验?

说我有以下CSV数据文件: -

Bob, Bill, Ben, Brett
Bob, Bill, Brian
Bob, John, Jim
Alice, John, Jill, Jane
Alice, Jean
Alice, Janet, Brian

我想将其转换为树结构以获得以下内容:

1, Bob
2, Alice
1.1, Bill
1.1.1, Ben
1.1.1.1, Brett
1.1.2, Brian
1.2, John
1.2.1, Jim
2.1, John
2.1.1, Jill
2.1.1.1, Jane
2.2, Jean
2.3, Janet
2.3.1, Brian

我查看过Tree::Simple并知道如果我可以将数据放入树中,我可以使用Tree::Parser以正确的编号输出数据。

我想要的是一个如何逐行输入数据的例子。我可以首先将文件的每一行读入一个数组,然后将$array[0]作为第一个孩子添加 - 例如

$tree->addChildren(Tree::Simple->new($array[0]));

我不知道该怎么做:

  1. 检查树中是否已存在具有该名称的子项,以便我不会两次添加说Bob。

  2. 为每个孩子找到正确的父母,这样就说Jill是作为爱丽丝孩子的约翰的孩子,而不是鲍勃的孩子

  3. 我非常感谢这个问题的一些帮助。我已经工作了4天,无法到达那里。如果Tree::Simple不是最好的方法,也许还有另一种方法吗?

1 个答案:

答案 0 :(得分:1)

此程序会读取您从DATA文件句柄显示的示例数据,并且似乎可以执行您需要的操作。

它通过将它们放入由每个节点的值索引的哈希中来跟踪树中的所有节点。每次输入文件中出现值时,都会检查散列以查看是否已存在该节点。如果不是,则创建新的树节点并将其添加到散列中。无论哪种方式,该节点都用作同一行上下一个值的父节点。

没有检查数据的一致性,并假设每个节点最多只有一个父节点。如果值在另一个父名称下的数据文件中第二次出现,则忽略新关联。

use strict;
use warnings;

use Tree::Simple;
use Tree::Parser;

my %nodes;

my $root = Tree::Simple->new('root');

while (<DATA>) {
  my $parent = $root;
  for my $name (split) {
    $name =~ tr/,//d;
    $nodes{$name} = Tree::Simple->new($name, $parent) unless $nodes{$name};
    $parent = $nodes{$name};
  }
}

my $tp = Tree::Parser->new($root);
$tp->useDotSeparatedLevelFilters;
print "$_\n" for $tp->deparse

__DATA__
Bob, Bill, Ben, Brett
Bob, Bill, Brian
Bob, John, Jim
Alice, John, Jill, Jane
Alice, Jean
Alice, Janet, Brian

<强>输出

1 Bob
1.1 Bill
1.1.1 Ben
1.1.1.1 Brett
1.1.2 Brian
1.2 John
1.2.1 Jim
1.2.2 Jill
1.2.2.1 Jane
2 Alice
2.1 Jean
2.2 Janet