Struppi: Spalten sortieren

Beitrag lesen

mein Vorhaben ist recht simple zu erklären. Ich habe eine Datei mit etlichen Daten in Tabellenform. Beispiel:

und genauso simpel ist die Lösung: Nimm eine Datenbank, diese sind für genau solche Situationen konstruiert.

Ich habe auch lange an solchen Fragestellungen mit selbstgebauten Code rumgebastelt. Sobald du das erste mal ein bisschen mit SQL gemacht hast, willst du sowas nie wieder von Hand machen.

Aber na gut:

Datei mit 6 Spalten

20041215 2.3 812.2 48 32 20
20041215 31.9 12.2 34 12 54
20041215 1.5 512.2 96 2 2
20041215 1231.3 2.2 8 32 60

...

Nun möchte ich gerne die Daten nach einer bestimmten Spalte sortieren und das möglichst Dynamisch. Das heißt dem Script wird als Argument die Spaltennummer mitgegeben, nach der das Script sortieren soll.

#! /usr/bin/perl -w
use strict;

my @daten;
my $test;
foreach(<DATA>)
{
    chomp;
    push @daten, [split/ /, $_];
}
$test = [ sortiereNachSpalte(0) ];
output( $test, 0 );

$test = [ sortiereNachSpalte(1) ];
output( $test, 1 );

$test = [ sortiereNachSpalte(2) ];
output( $test, 1 );

sub sortiereNachSpalte
{
    my $x = shift || 0;
    return sort { $a->[$x] <=> $b->[$x]} @daten;
}

sub output
{
    my $arr = shift;
    my $spalte = shift || 0;
    my $nr = 1;
    print "sortiert nach Spalte: $spalte\n";
    foreach( @$arr)
    {
        print sprintf "Line %02d:%8s %7.2f %5.1f %02d %2d %2d\n", $nr, @$_;
        $nr++;
    }
}

__DATA__
20041215 2.3 812.2 48 32 20
20041215 31.9 12.2 34 12 54
20041215 1.5 512.2 96 2 2
20041215 1231.3 2.2 8 32 60

Das geht aber nur, wenn die Daten auch Zahlen sind.

Ansonsten muss die sortierfunktion für die Spalte so geändert werden:
return sort { $a->[$x] cmp $b->[$x]} @daten;

Struppi.