Gavin Laking wrote:
>
> One of my scripts uses a home-brewed flatfile database to store
> information, and I've run up against a problem when I wish to sort
> columns of data.
>
> An example of the database file:
> (items,fruit,date)
>
> 16,apples,20021118-1725
> 22,bananas,20021118-1648
> 4,grapes,20021118-1921
>
> To open and place the items into an array, I do this (formatted so that
> some mail client doesn't make it *really* unreadable :-P ) :
>
> open ('FILE',"$databaseFile") || die;
> @dbfile = <FILE>;
> for ($a = 0; $a < @dbfile; $a++) {(
> $items[$a],
> $fruit[$a],
> $date[$a],
> $chop)=split(/,/,$dbfile[$a]);}
>
> With a little pretty printing can show us the database in 3D. I'm not
> going to include the code for pretty printing here as it is unimportant,
> but the output I think is:
>
> [0]16,[0]apples,[0]20021118-1725
> [1]22,[1]bananas,[1]20021118-1648
> [2]4,[2]grapes,[2]20021118-1921
>
> Now my problem is that I can sort the database by 'items', both
> ascending and descending order:
>
> (ascending)
> @dboutfile = sort {($a =~ /(\d+)/)[0] <=> ($b =~ /(\d+)/)[0]} @dbfile;
>
> (descending)
> @dboutfile = sort {($b =~ /(\d+)/)[0] <=> ($a =~ /(\d+)/)[0]} @dbfile;
>
> But I can't seem to sort the database by any of the other fields. I've
> tried incrementing the '0's and changing '\d+' to '\w+' but I can't get
> it into reverse alphabetical or chronological order or any other sort
> type other than ascending or descending 'items' order.
>
> Does anybody know what I'm waffling about, and can solve this problem,
> or am I really blessed with programmers illiteracy? Thanks all,
You can make it a bit simpler if you use an array of arrays.
open( FILE, $databaseFile ) || die "Cannot open $databaseFile: $!";
my @dbfile;
while ( <FILE> ) {
chomp;
push @dbfile, [ split /,/ ];
}
# Sort by item (ascending)
my @dboutfile = sort { $a->[0] <=> $b->[0] } @dbfile;
# Sort by fruit (descending)
my @dboutfile = sort { $b->[1] cmp $a->[1] } @dbfile;
# Sort by date (descending) then by item (ascending) then by fruit
(ascending)
my @dboutfile = sort { $b->[2] cmp $a->[2] or
$a->[0] <=> $b->[0] or
$a->[1] cmp $b->[1] } @dbfile;
John
--
use Perl;
program
fulfillment
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]