0

Tree::SimplePerlでデータをツリーに使用または配置した経験のある人はいますか?

次の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、正しい番号で出力するために使用できることを確認しました。

私が欲しいのは、データを1行ずつ入力する方法の例です。ファイルの各行を配列に読み込み$array[0]、最初の子として追加することから始めることができます-例:

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

方法がわからないのは次のとおりです。

  1. ツリーにその名前の子がすでに存在するかどうかを確認して、Bobを2回追加しないようにします。

  2. ジルがボブの子ではなくアリスの子であるジョンの子として入力されるように、各子の正しい親を見つけます

この問題について助けていただければ幸いです。私は4日間取り組んできましたが、そこにたどり着くことができません。これを行うための最良の方法ではない場合Tree::Simple、おそらく別の方法がありますか?

4

1 に答える 1

1

DATAこのプログラムは、ファイルハンドルから表示されたサンプル データを読み取り、必要なことを実行するように見えます。

各ノードの値でインデックス付けされたハッシュにそれらを配置することにより、ツリー内のすべてのノードを追跡します。入力ファイルに値が現れるたびに、ハッシュがチェックされ、そのノードがすでに存在するかどうかが確認されます。そうでない場合は、新しいツリー ノードが作成され、ハッシュに追加されます。どちらの方法でも、ノードは同じ行の次の値の親として使用されます。

データの一貫性はチェックされず、すべてのノードに最大で 1 つの親があると想定されます。別の親名の下に値がデータ ファイルに 2 回表示される場合、新しい関連付けは無視されます。

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 に答える