Sortierung und Umgang mit deutschen Umlauten |
Definition:
Zahl | Text |
---|---|
1 | 1 |
7 | 10 |
10 | 115 |
13 | 13 |
22 | 22 |
76 | 7 |
115 | 76 |
Die ungewohnte Reihenfolge bei obiger Textsortierung erklärt sich dadurch, dass Texte zeichenweise verglichen werden und keine Wertigkeit der einzelnen Stellen haben, wie Zahlen.
Beispiele:
Ohne Abfragebedingung wird der komplette Inhalt einer Datenbank in chronologischer Reihenfolge ausgegeben (die zuerst eingetragenen zuerst). Mit Abfrage erfolgt die Sortierung nach dem ersten abgefragten Feld:
<do action=all Name~=ba>
Soll die Ausgabe nach einem anderen Feld sortiert werden, als abgefragt wird, kann dies mit "sort" bestimmt werden.
<loop Name~=ba sort=Vorname>$Name, $Vorname<br></loop>
Gibt alle Einträge aus, bei denen das Feld "Name" mit "ba" anfaengt, sortiert nach dem Feld "Vorname", also z.B. "Baffke, Claudia", "baller, jochen", "Baumann, Karen", "Bachmann, Stefan" usw.
Tip: Soll der komplette Inhalt ausgegeben werden, allerdings sortiert nach einem bestimmten Feld, geben Sie folgendes an:
<do action=all Name==*>
Soll die Ausgabe umgekehrt werden, muss ein Minuszeichen "-" vor der Feldangabe stehen:
<loop Name~=ba sort=-Vorname>$Name, $Vorname<br></loop>
Gibt alle Einträge, bei denen das Feld "Name" mit "ba" anfaengt, sortiert nach dem Feld "Vorname", in umgekehrter Reihenfolge aus, also z.B. "Bachmann, Stefan", "Baumann, Karen", "baller, jochen", "Baffke, Claudia" usw.
Soll der komplette Inhalt, allerdings in umgekehrter Reihenfolge ausgegeben werden, genügt ein "sort=-":
<loop sort=->$Name<br></loop>
Dies geht auch in Verbindung mit einer Abfrage:
<loop Name~=b sort=->$Name<br></loop>
Sie können auch mehrere Felder bei "sort" angeben. Die Sortierung erfolgt dann zuerst nach dem ersten Feld, dann nach dem zweiten, dem dritten usw.
<loop Name~=ba sort=Name,Vorname,-Alter>$Name, $Vorname ($Alter)<br></loop>
Sie können alle obigen Beispiele auch in der URL verwenden, z.B.:
http://baseportal.de/cgi-bin/baseportal.pl?htx=/sepperl/adressen&Name==*&sort=-
baseportal sortiert mit dieser Einstellung nach den deutschen Regeln, d.h. Umlaute werden wie die entsprechenden Grundbuchstaben behandelt: ä wie a, ö wie o etc. - Schäden wie Schaden und damit vor Schadensfall. Bei sonst gleichlautendem Begriff stehen sie hinter dem zugehörigen Grundbuchstaben: Schaden also vor Schäden und fuhren vor führen. Das "scharfe s" ß sortiert baseportal nach der ISO-Norm 5007-1 hinter ss ein, Masse steht also vor Maße. Der Duden sortiert dies -unlogischerweise- anders herum; bei den anderen Umlauten steht der Umlaut schliesslich auch hinter dem Grundbuchstaben.
Dazu muss die Sortierung des gewünschten Feldes auf "Text (de)" gestellt werden und die Datenbank danach reorganisiert werden.
Auch bei Umwandlungen in Groß-/Kleinschrift mit uc bzw. lc werden Umlaute berücksichtigt:
<perl> out uc("Mäßigung"); </perl>
Gibt MÄSSIGUNG aus. Bei der Umwandlung von Gross- in Kleinbuchstaben gibt es keine Ersetzung für das ß, die Rückwandlung mit
<perl> out lc("MÄSSIGUNG"); </perl>
ergibt mässigung.
Möchte man eigene Texte (Arrays) nach deutschen Umlauten sortieren, so gibt es dafür die Funktion sort_de:
<perl> @x=sort_de("hans", "hähä", "haha", "Hänschen", "Haar", "hänftling", "Hägar", "HAHA"); out "@x"; </perl>
Führt zu folgender Ausgabe:
Haar Hägar HAHA haha hähä hänftling hans Hänschen
Wie man sieht werden Grossbuchstaben dabei ignoriert. Möchte man dies nicht, so muss man das "de" in der Funktion GROSS schreiben:
<perl> @x=sort_DE("hans", "hähä", "haha", "Hänschen", "Haar", "hänftling", "Hägar", "HAHA"); out "@x"; </perl>
Führt zu folgender Ausgabe:
HAHA Haar Hägar Hänschen haha hähä hänftling hans
Um zwei Wörter mit Umlauten zu vergleichen gibt es die Funktion cmp_de. Diese liefert -1 zurück wenn das 1. Wort vor dem 2. Wort steht, 1 wenn das 2. Wort vor dem 1. Wort steht und 0 wenn beide identisch sind:
<perl> out cmp_de "Kalb", "kälber"; out cmp_de "Wörter", "wort"; </perl>
Ergibt -1 und 1. Auch hier werden mit einem grossen "DE" Grossbuchstaben beachtet:
<perl> out cmp_DE "Kalb", "kälber"; out cmp_DE "Wörter", "wort"; </perl>
Ergibt 1 und 1.
Damit sind auch alle anderen Textvergleiche wie lt, le etc. möglich:
Bedingung | Entspricht |
---|---|
cmp_de($x,$y)<0 | $x lt $y |
cmp_de($x,$y)<=0 | $x le $y |
cmp_de($x,$y)>0 | $x gt $y |
cmp_de($x,$y)>=0 | $x ge $y |
Die Abfrage auf Gleichheit funktioniert mit oder ohne Umlaute immer mit eq.