Perl 生成树::从文件数据生成简单对象

Perl 生成树::从文件数据生成简单对象,perl,tree,Perl,Tree,有没有人有过在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

有没有人有过在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
,知道如果我能将数据放入树中,我就可以用正确的编号将其输出

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

$tree->addChildren(Tree::Simple->new($array[0]));
我不知道怎么做的是:

  • 检查树中是否已经有同名的孩子,这样我就不会在树中添加两次say Bob

  • 为每个孩子找到正确的父母,这样说吉尔是作为约翰的孩子而输入的,而约翰是爱丽丝的孩子,而不是鲍勃的孩子


  • 我将非常感谢在这个问题上提供一些帮助。我已经做了4天了,到不了那里。如果
    Tree::Simple
    不是执行此操作的最佳方法,可能还有其他方法?

    此程序从
    数据
    文件句柄读取您显示的示例数据,并显示为执行您需要的操作

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

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

    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
    

    请注意,您的数据中有,例如,John是Alice和Bob的儿子<代码>树::Simple实现不支持具有多个父节点的n元树。这是一个问题还是您的数据不具有代表性?非常感谢您的帮助-这让我绕过了重复相同值节点的问题。然而,如果它们有不同的父母,我真的需要保留重复的值-例如,John需要显示为bob的孩子和alice的孩子;jane应该是alice的孙子,而不是bob的孙子-我就是不知道如何做到这一点。那么您选择了错误的数据结构。正如我所说,n元树中的节点只能有一个父节点。解决方案不是添加具有相同值但具有不同父节点的第二个节点,但在我推荐其他方法之前,您必须解释您的目的。一旦你建造了这棵树,你想对它做什么?你说这是“为了获得[编号输出]”,但显然还有更多。我的程序必须为第三方软件包生成输入,该软件包使用它在网页上创建下拉层次菜单和子菜单。例如,有两个顶级菜单,bob和alice,每个顶级菜单都有一个子菜单john。虽然他们都叫约翰,但实际上他们是不同的物品。子菜单项jill将作为john的子菜单进入,john是alice的子菜单,而不是bob的子菜单。数据必须以以下格式进入程序:编号、数据、父编号,例如1、bob、0 2、alice、0 1.1.、bill、1 1.1.1、ben、1.1
    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