Die Webseiten der Fachschaft Informatik am ERG Saalfeld
sort (3. Teil)
Es sollen hier die Datensätze einer csv-Datei (CSV = Comma-separated values), in
der in jeder Zeile die ID, der Nachname, der Vorname und die Klasse (in dieser Reihenfolge) angegeben sind,
so sortiert werden, dass sie nach Klassen und innerhalb der Klassen nach dem Nachnamen sortiert sind.
CSV-Datei
1821;Mustermann;Manfred;10c
1822;Musterfrau;Maxi;08c
1823;Goethe;Johann;10a
1824;Bach;Johann;10a
Da der Vergleich der Datensätze zuerst nach dem letzten und dann nach dem zweiten Element
erfolgen soll, muss genau dass in einer Vergleichsfunktion angegeben werden. Die Vergleichsfunktion wird in
diesem Beispiel in der Subroutine vergleich implementiert. Diese Funktion wird
dem Befehl "sort" übergeben.
Programm
use strict;
use warnings;
open FILE, '<', 'schueler.csv' or die "konnte schueler.csv nicht zum Lesen oeffnen. $!\n";
my @feld = <FILE>; # wir lesen die Datei ein
close FILE;
chomp @feld; # wir löschen am Zeilenende die Zeilenumbrüche
foreach my $element (@feld) {
print $element, "\n";
}
print "\n\n";
@feld = sort {&vergleich($a,$b)} @feld;
foreach my $element (@feld) {
print $element, "\n";
}
print "\n\n";
### Ende des Hauptprogramms ###
# ein Datensatz hat das Format: ID;Name;Vorname;Klasse
# Beispiel: 1821;Mustermann;Manfred;07c
sub vergleich # sortieren nach Klasse und dann nach Name
{
my $datensatz1 = shift; # Datensatz 1
my $datensatz2 = shift; # Datensatz 2
my @temp1 = split ';', $datensatz1;
my @temp2 = split ';', $datensatz2;
return ($temp1[3] cmp $temp2[3] or $temp1[1] cmp $temp2[1]);
}
__END__
Der Aufruf sah bei mir so aus:
Aufgaben
- Bringen Sie das Programm zum Laufen. Die csv-Datei heißt schueler.csv und liegt im gleichen Verzeichnis.
- Ergänzen Sie weitere Datensätze und rufen Sie das Programm damit auf.
- Ändern Sie den Aufruf von "sort" im Hauptprogramm so ab, dass die Variablen $a und $b vertauscht werden. Testen Sie das.
- Ändern Sie das gegebene Programm so, dass die Klassen in absteigender Reihenfolge und die Namen in aufsteigender Reihenfolge sortiert werden.
- Ändern Sie das Programm so, dass zuerst nach Klassen und innerhalb der Klassen nach der ID sortiert wird. Testen Sie das!
zurück
© ERG Saalfeld - Hans-Dietrich Kirmse 18.08.2017
|