in reply to Re: Reading Text File into Hash to Parse and Sort
in thread Reading Text File into Hash to Parse and Sort

Thank you for all of the great feedback. It will help in my understanding of Perl to see how the Monks work through problems.

The example code I provided worked for me. It allowed me to parse data from a text file using arrays, but I am trying to do this on a larger scale with a new file with hashes.

Ultimately, I am trying to learn how to create a hash to sort data by a specific column from a text file. I would also like to learn how to parse data from a text file using hashes.

I don't know how to reference all columns from a text file using hashes and then isolate one specific column to sort or parse. This is one of many knowledge gaps for me.

There is nothing in the books or posts I have read which shows me how to do this. It seems to be a pretty basic, but I just can't find this information.

I am just getting started with Perl, so I will go back to the books and come back with more well-organized questions in the future.

Thank you for your time and all of your responses.

  • Comment on Re^2: Reading Text File into Hash to Parse and Sort

Replies are listed 'Best First'.
Re^3: Reading Text File into Hash to Parse and Sort
by Anonymous Monk on Apr 22, 2015 at 19:51 UTC

    I am trying to do this on a larger scale with a new file with hashes.

    Ultimately, I am trying to learn how to create a hash to sort data by a specific column from a text file. I would also like to learn how to parse data from a text file using hashes.

    Tux has already pointed out the better tool: Text::CSV. It will handle all of the details people forget about when dealing with delimited files like what you have. Assuming the first line of the file has a list of column names, you'll end up with something like:
    use strict; use warnings; use Text::CSV; # I had to specify "XS" in the use line and in the call to new, below #use Text::CSV_XS; open my $fh, '<', 'filename.txt' or die "Cannot open filename.txt: $!\n"; my $parser = Text::CSV->new({ sep_char => '|' }); $parser->column_names($parser->getline($fh)); # $parser->getline_hr_all() returns a reference to an array; # which is easy enough to use, but the @{...} syntax unpacks # it to an array, which you might find convenient my @rows = @{$parser->getline_hr_all($fh)}; close $fh; # sort can take a block of code to specify how things should # be sorted, which in your case would be "by which columns" # use cmp for string sort; <=> for numeric sort, and # Unicode::Collate ( https://metacpan.org/pod/Unicode::Collate ) # for anything complex for my $row (sort { $a->{col_name} cmp $b->{col_name} } @rows) { ... } for my $row (sort { $a->{number} <=> $b->{number} } @rows) { ... }