Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sort CSV based on a certain column?

Tags:

sorting

perl

I'm sure I've done this in the past and there is something small I'm forgetting, but how can I sort a CSV file on a certain column? I'm interested in answers with and without 3rd party Perl modules. Mainly methods without, since I don't always have access to install additional modules.

Example data:

name,25,female
name,24,male
name,27,female
name,21,male

desired end result after sorting on the 2nd numeric column:

name,21,male
name,24,male
name,25,female
name,27,female
like image 834
ckarl787 Avatar asked Nov 28 '22 15:11

ckarl787


1 Answers

As CSV is a pretty complex format, it is better to use a module that does the work for us.

Following is an example using the Text::CSV module:

#!/usr/bin/env perl

use strict;
use warnings;

use constant AGE => 1;

use Text::CSV;

my $csv = Text::CSV->new();

my @rows;
while ( my $row_ref = $csv->getline( \*DATA ) ) {
    push @rows, $row_ref;
}

@rows = sort { $a->[AGE] <=> $b->[AGE] } @rows;

for my $row_ref (@rows) {
    $csv->combine(@$row_ref);
    print $csv->string(), "\n";
}

__DATA__
name,25,female
name,24,male
name,27,female
name,21,male
like image 82
Alan Haggai Alavi Avatar answered Dec 10 '22 02:12

Alan Haggai Alavi