G'day ovedpo15,

I used these steps:

  1. Read the file and collect all data in a hash.
  2. Generate arrays of ancestry elements for each ID.
  3. Sort array elements; join; print.

Here's the code:

#!/usr/bin/env perl use strict; use warnings; my $root = '#'; my %tree; while (<DATA>) { chomp; my ($id, $pid, $name) = split /,/; $tree{$id} = {name => $name, pid => $pid}; } my @paths; push @paths, concat($_, \%tree) for keys %tree; print join(',', @$_), "\n" for sort { @$a <=> @$b || $a->[0] cmp $b->[0] } @paths; sub concat { my ($id, $tree, $path) = @_; $path = [] unless defined $path; push @$path, $tree->{$id}{name}; if ($tree->{$id}{pid} ne $root) { concat($tree->{$id}{pid}, $tree, $path); } return $path; } __DATA__ 15,10,name3 10,#,name1 12,10,name2 5,12,name4 8,5,name5

Output:

name1 name2,name1 name3,name1 name4,name2,name1 name5,name4,name2,name1

Note that I changed the last line of your data: s/8,5,name4/8,5,name5/.

Also, it's completely unclear from your expected output, what ordering you wanted in the general case. I've written a sort to give the expected output for a single set of input data. Ask yourself if, given different input, "name2,name1" was "name2,name6,name1", what would the order be? Adjust my "sort { ... }" as required.

— Ken


In reply to Re: Reorganizing the content of a file by kcott
in thread Reorganizing the content of a file by ovedpo15

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.