0

有没有人有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 作为 John 的孩子输入,John 是 Alice 的孩子,而不是 Bob 的孩子

对于这个问题,我将不胜感激。我已经为此工作了 4 天,但无法到达那里。如果Tree::Simple这不是最好的方法,也许还有另一种方法?

4

1 回答 1

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
于 2012-07-16T14:55:37.413 回答