App-CSVUtils
view release on metacpan or search on metacpan
lib/App/CSVUtils/csv_sort_rows.pm view on Meta::CPAN
ascending):
name,age
Dennis,15
Andy,20
Ben,30
Jerry,30
Example output CSV (using `--by-field -age`, which means by age numerically and
descending):
name,age
Ben,30
Jerry,30
Andy,20
Dennis,15
Example output CSV (using `--by-field name`, which means by name ascibetically
and ascending):
name,age
Andy,20
Ben,30
Dennis,15
Jerry,30
Example output CSV (using `--by-field ~name`, which means by name ascibetically
and descending):
name,age
Jerry,30
Dennis,15
Ben,30
Andy,20
Example output CSV (using `--by-field +age --by-field ~name`):
name,age
Dennis,15
Andy,20
Jerry,30
Ben,30
You can also reverse the sort order (`-r`) or sort case-insensitively (`-i`).
For more flexibility, instead of `--by-field` you can use `--by-code`:
Example output `--by-code '$a->[1] <=> $b->[1] || $b->[0] cmp $a->[0]'` (which
is equivalent to `--by-field +age --by-field ~name`):
name,age
Dennis,15
Andy,20
Jerry,30
Ben,30
If you use `--hash`, your code will receive the rows to be compared as hashref,
e.g. `--hash --by-code '$a->{age} <=> $b->{age} || $b->{name} cmp $a->{name}'.
A third alternative is to sort using <pm:Sort::Sub> routines. Example output
(using `--by-sortsub 'by_length<r>' --key '$_->[0]'`, which is to say to sort by
descending length of name):
name,age
Dennis,15
Jerry,30
Andy,20
Ben,30
If none of the `--by-*` options are specified, the utility will bail unless
there's a default that can be used, e.g. when CSV has a single field then that
field will be used.
_
add_args => {
%App::CSVUtils::argspecopt_hash,
%App::CSVUtils::argspecs_sort_rows,
},
tags => ['category:sorting'],
on_input_header_row => \&App::CSVUtils::csv_sort_rows::on_input_header_row,
on_input_data_row => \&App::CSVUtils::csv_sort_rows::on_input_data_row,
after_close_input_files => \&App::CSVUtils::csv_sort_rows::after_close_input_files,
);
1;
# ABSTRACT: Sort CSV rows
__END__
=pod
=encoding UTF-8
=head1 NAME
App::CSVUtils::csv_sort_rows - Sort CSV rows
=head1 VERSION
This document describes version 1.036 of App::CSVUtils::csv_sort_rows (from Perl distribution App-CSVUtils), released on 2025-02-04.
=for Pod::Coverage ^(on|after|before)_.+$
=head1 FUNCTIONS
=head2 csv_sort_rows
Usage:
csv_sort_rows(%args) -> [$status_code, $reason, $payload, \%result_meta]
Sort CSV rows.
This utility sorts the rows in the CSV. Example input CSV:
lib/App/CSVUtils/csv_sort_rows.pm view on Meta::CPAN
ascending):
name,age
Dennis,15
Andy,20
Ben,30
Jerry,30
Example output CSV (using C<--by-field -age>, which means by age numerically and
descending):
name,age
Ben,30
Jerry,30
Andy,20
Dennis,15
Example output CSV (using C<--by-field name>, which means by name ascibetically
and ascending):
name,age
Andy,20
Ben,30
Dennis,15
Jerry,30
Example output CSV (using C<--by-field ~name>, which means by name ascibetically
and descending):
name,age
Jerry,30
Dennis,15
Ben,30
Andy,20
Example output CSV (using C<--by-field +age --by-field ~name>):
name,age
Dennis,15
Andy,20
Jerry,30
Ben,30
You can also reverse the sort order (C<-r>) or sort case-insensitively (C<-i>).
For more flexibility, instead of C<--by-field> you can use C<--by-code>:
Example output C<< --by-code '$a-E<gt>[1] E<lt>=E<gt> $b-E<gt>[1] || $b-E<gt>[0] cmp $a-E<gt>[0]' >> (which
is equivalent to C<--by-field +age --by-field ~name>):
name,age
Dennis,15
Andy,20
Jerry,30
Ben,30
If you use C<--hash>, your code will receive the rows to be compared as hashref,
e.g. `--hash --by-code '$a->{age} <=> $b->{age} || $b->{name} cmp $a->{name}'.
A third alternative is to sort using L<Sort::Sub> routines. Example output
(using C<< --by-sortsub 'by_lengthE<lt>rE<gt>' --key '$_-E<gt>[0]' >>, which is to say to sort by
descending length of name):
name,age
Dennis,15
Jerry,30
Andy,20
Ben,30
If none of the C<--by-*> options are specified, the utility will bail unless
there's a default that can be used, e.g. when CSV has a single field then that
field will be used.
This function is not exported.
Arguments ('*' denotes required arguments):
=over 4
=item * B<by_code> => I<str|code>
Sort by using Perl code.
C<$a> and C<$b> (or the first and second argument) will contain the two rows to be
compared. Which are arrayrefs; or if C<--hash> (C<-H>) is specified, hashrefs; or
if C<--key> is specified, whatever the code in C<--key> returns.
=item * B<by_fields> => I<array[str]>
Sort by a list of field specifications.
Each field specification is a field name with an optional prefix. C<FIELD>
(without prefix) means sort asciibetically ascending (smallest to largest),
C<~FIELD> means sort asciibetically descending (largest to smallest), C<+FIELD>
means sort numerically ascending, C<-FIELD> means sort numerically descending.
=item * B<by_sortsub> => I<str>
Sort using a Sort::Sub routine.
When sorting rows, usually combined with C<--key> because most Sort::Sub routine
expects a string to be compared against.
When sorting fields, the Sort::Sub routine will get the field name as argument.
=item * B<ci> => I<bool>
(No description)
=item * B<hash> => I<bool>
Provide row in $_ as hashref instead of arrayref.
=item * B<inplace> => I<true>
Output to the same file as input.
Normally, you output to a different file than input. If you try to output to the
same file (C<-o INPUT.csv -O>) you will clobber the input file; thus the utility
prevents you from doing it. However, with this C<--inplace> option, you can
output to the same file. Like perl's C<-i> option, this will first output to a
( run in 0.364 second using v1.01-cache-2.11-cpan-d7a12ab2c7f )