mbm has asked for the wisdom of the Perl Monks concerning the following question:

I have a csv file like this: "Task1,Task2",ABC,ABC,Mon 05/22/2009,mbm "Task3,Task4",XYZ,XYZ,Mon 05/20/2009,mbm "Task5,Task6",ABC,ABC,Mon 06/25/2009,mbm "Task7,Task8",ABC,ABC,Mon 03/28/2009,mbm I would like to sort this csv file based on the date (ascending) in th +e 4th column above to produce an output as follows: "Task7,Task8",ABC,ABC,Mon 03/28/2009,mbm "Task3,Task4",XYZ,XYZ,Mon 05/20/2009,mbm "Task1,Task2",ABC,ABC,Mon 05/22/2009,mbm "Task5,Task6",ABC,ABC,Mon 06/25/2009,mbm I know there will be some modules to do this. Can you guys help me out + in both approaches (using modules and without using the modules) Thanks for you response in advance! ~Manjunath

Replies are listed 'Best First'.
Re: Sort rows in a csv file based on a date column
by linuxer (Curate) on Apr 08, 2009 at 17:27 UTC

    How do you want it to be sorted?

    Lexically by the column content? (your example looks like that)

    Sorted by date (1. by month, 2. by day, 3. by year) and it was coincidence, that all dates are on a monday?

    moritz already mentioned Text::CSV and sort on the Chatterbox.

    I, personally, thought about a solution using DBD::CSV

    What's your current problem? To read the docs? To write the code?

    What do you expect us the monks to do?

    Regards,
    Linuxer

Re: Sort rows in a csv file based on a date column
by apl (Monsignor) on Apr 08, 2009 at 18:05 UTC
    I'd use the *nix sort command, myself...
Re: Sort rows in a csv file based on a date column
by bichonfrise74 (Vicar) on Apr 08, 2009 at 21:55 UTC
    Hello,

    I was looking at this question and got curious, so I wrote the script below to solve this using Text::CSV. But I'm not sure if this is the efficient way of doing this especially at the last lines where I am re-creating the CSV file.

    Not sure if I can use the Text::CSV->combine and Text::CSV->string methods to re-create the CSV file.

    Any comments?

    #!/usr/bin/perl use strict; use Text::CSV; my $old_string; my $csv = Text::CSV->new(); while ( my $line = <DATA> ) { $old_string = $old_string . join( " ", $csv->fields() ) . "\n" if ( $csv->parse( $line ) ); } my @new_string = map { $_->[0] } sort { $a->[1] cmp $b->[1] } map { [$_, (split)[4]] } split( /\n/, $old_string ); # Recreating the CSV data. foreach my $i (@new_string) { my $j = join "\",\"", split( " ", $i); print "\"$j\" \n"; } __DATA__ "Task1,Task2",ABC,ABC,Mon 05/22/2009,mbm "Task3,Task4",XYZ,XYZ,Mon 05/20/2009,mbm "Task5,Task6",ABC,ABC,Mon 06/25/2009,mbm "Task7,Task8",ABC,ABC,Mon 03/28/2009,mbm
      Hi, Thanks for the response. I am looking for sorting a csv file based on a column of dates in such a way that, the output csv file will have rows with sorted dates (ascending). I have perl 5.6 and perl 5.8.3. So can't use modules to do this.