Umlaute sortieren
BAKKA
- perl
0 Stefan Muenz0 Stefan Muenz0 BAKKA
Hallihallo
Ich hoffe , dass dieses Thema nicht schon im Archiv vorhanden ist, aber ich hab das Archiv immerhin danach durchsucht...
Also ich moechte gerne eine Telefonliste sortieren
und innerhalb dieser Sportierung sollen umlaute wie Ä als Ae sortiert werden... ich koennt natuerlich Alle Ä's durch Ae erstzen, sortieren und wieder erstzen, allerdings wuerden dadurch "natuerliche" Ae's auch umgewandelt werden... was kann ich nun also tun?
gruss
BAKKA
Hallo BAKKA
ich koennt natuerlich Alle Ä's durch Ae erstzen, sortieren und wieder erstzen, allerdings wuerden dadurch "natuerliche" Ae's auch umgewandelt werden...
Kannst ja eine andere Zwischenloesung benutzen, z.B. die HTML-gerechte. Also etwa:
foreach $listEntry (@Namen) {
$listEntry =~ s/Ä/ä/g;
}
Und beim Rueckumwandeln nach dem sort:
foreach $sortListEntry (@Namen) {
$sortListEntry =~ s/ä/Ä/g;
}
viele Gruesse
Stefan Muenz
Hallo BAKKA
Hab mich wieder kurzfristig selber verarscht. Ich meinte:
foreach $listEntry (@Namen) {
$listEntry =~ s/Ä/Ä/g;
}
bzw.
foreach $sortListEntry (@Namen) {
$sortListEntry =~ s/Ä/Ä/g;
}
viele Gruesse
Stefan Muenz
Danke ersteinmal fuer den Loesungsansatz
foreach $listEntry (@Namen) {
»» $listEntry =~ s/Ä/Ä/g;
}
bzw.
foreach $sortListEntry (@Namen) {
»» $sortListEntry =~ s/Ä/Ä/g;
}
Mein Problem ist allerdings, dass wenn ich die sort-funktion auf Ä loslasse wird er es falsch einsortieren...also nicht als Ae....
Auf neue Anregungen hoffend
BAKKA
Mein Problem ist allerdings, dass wenn ich die sort-funktion auf Ä loslasse wird er es falsch einsortieren...also nicht als Ae....
Ich meine natuerlich &_A_u_m_l_; und nicht Ä
Hallo BAKKA,
(Hörst Du schlecht, oder warum muß ich Dich so anschreien? Wird man ja ganz heiser von ;-)
Mein Problem ist allerdings, dass wenn ich die sort-funktion auf Ä loslasse wird er es falsch einsortieren...also nicht als Ae....
»» Ich meine natuerlich &_A_u_m_l_; und nicht Ä
Dann tausch doch gegen etwas Eindeutiges aus, also etwas, das in Deiner Liste nicht vorkommt. Sonderzeichen sind da schon mal ein guter Ansatz, besser ist:
Da alles auch ganz am Anfang stehen soll (gehe ich einfach mal von aus) könntest Du z.B. die Zahlen ganz nach oben schieben lassen, dann steht dem Ersetzen von z.B "Ä" durch "A1111" et vice versa eigentlich nichts mehr im Wege, oder? Da die anderen Umlaute wohl auch korrekt bei den ungepunkteten Verwandten stehen sollen, ist es nötig, den jeweiligen Vokal vorn anzustellen. Das impliziert natürlich wieder, das Du nach mehr als nur dem ersten Buchstaben sortierst. 5 Zeichen müssen selbstverständlich nicht sein, 2 sollten eigentlich genügen, es sei denn, Du hast auch "A1" im Sortierfeld, da könnten sich dann Staus entwickeln ;-)
Gruß
Christoph
(Hörst Du schlecht, oder warum muß ich Dich so anschreien? Wird man ja ganz heiser von ;-)
eigentlich nicht... ich hab mich vielleicht ein wenig undeutlich ausgedrueckt:
als Beispielliste
Boekel
Bobel
Böbel
wuerde nach Srotierung genauso aussehen
Mein Ziel ist es aber, das die Liste sortiert so aussieht:
Bobel
Böbel
Boekel
Also , (wie beim Telefonbuch) dass das ö als oe gewertet wird; mit o1111 wuerde die liste so aussehen
Böbel
Bobel
Boekel
hoofe auf weitere Anregungen
BAKKA
Hallo BAKKA,
(Hörst Du schlecht, oder warum muß ich Dich so anschreien? Wird man ja ganz heiser von ;-)
»»
eigentlich nicht... ich hab mich vielleicht ein wenig undeutlich ausgedrueckt:
(ich bezog mich eigentlich auf den durchgehend groß geschriebenen Nickname, kam vieleicht nicht so gut rüber, sorry)
als Beispielliste
Boekel
Bobel
Böbel
wuerde nach Srotierung genauso aussehen
Mein Ziel ist es aber, das die Liste sortiert so aussieht:
Bobel
Böbel
Boekel
Also , (wie beim Telefonbuch) dass das ö als oe gewertet wird; mit o1111 wuerde die liste so aussehen
Böbel
Bobel
Boekel
Aha, zumindest der Stau auf der A1 fällt schon mal flach. Ist doch schon mal etwas.
Dann ersetze doch auch die normalen Vokale, also "Ä" mit "A2" und "A" mit "A1" und nachher wieder herumdrehen, dann müßte es eigentlich passen. Ist aber dann ein ziemlich großer Bogen, den der Workaround hier schlägt. Für "Realtimeanwendungen" wohl kaum zu gebrauchen.
Gruß
Christoph
Dann ersetze doch auch die normalen Vokale, also "Ä" mit "A2" und "A" mit "A1" und nachher wieder herumdrehen, dann müßte es eigentlich passen.
Die Idee hatte ich auch schon, bloss ist damit der wert von A =A2 und von Ä A1
Wuerde bedeuten:
Äther
Ather
Aether
==>also auch keine richtige Sortierung..
Ich hole die Daten von einem Directory-Server;
dort sind die namen auch ohne Umlaute Abgespeichert.. ma sehen ob ich damit weiterkomme...Lieber waere mir natuerlich eine Sortiermoeglichkeit, aber wenn es nunmal nicht geht:(.....
Trotzdem Danke fuer die Mithilfe
Bakka
P.S. mich wundert, dass Perl fuer dieses "elementare" Problem keine loesung vorsieht...
P.P.S
Falls ich natuerlich nur zu Blind fuer das offensichtliche sein sollte nehm' ich das 1. P.S. natuerlich zurueck :)
Hallo BAKKA,
Dann ersetze doch auch die normalen Vokale, also "Ä" mit "A2" und "A" mit "A1" und nachher wieder herumdrehen, dann müßte es eigentlich passen.
Die Idee hatte ich auch schon, bloss ist damit der wert von A =A2 und von Ä A1
Ja isses denn?!
Also nochmal zum mitschreiben:
1) alle Umlaute durch "X2" ersetzen, wobei "X" der dem Umlaut entsprechende Vokal ist. Damit wäre beim obigen Beispiel "Ä" = "A2".
2) alle normalen Vokale wie oben aber statt "X2" diesmal "X1"
Die Werte sind jetzt Ä = A2 und A = A1 usw.
3) sortieren
4) Alle Ersetzungen wieder rückgängig machen.
Das funktioniert, glaube es mir !
Ach so, beim Server funktioniert das auf eine gänzlich andere Weise, die sortieren nach den Binärcodes (dezimal meistens) mittels einer C - Routine, die sich konfigurieren läßt. So geht es übrigens auch mit Perl, ist aber nicht sehr einfach.
Grüße
Christoph
Das funktioniert, glaube es mir !
Das problem ist nur, dass das Ä dann groesser A ist, und somit
Aal
Azelot
Äbbe
Äzend
entstehen wuerde..
Ich hab jetzt nen Weg gefunden, das Ä wie ein Ae zubehandeln:
Ich speichere einfach den Wert 2mal ab; einmal ersetze ich Ä durch Ae. Dann speichere ich sie in einem String, sortiere sie, und geb nur das 2 aus
$string="Aebbe#Äbbe"
@array=split(/#/,$string)
print $array[1];
Gruss Bakka
P.S.
Das da oben ist natuerlich kein lauffaehiger Code..es soll lediglich meinen Weg veranschaulichen
;)
Hi,
mit Schmunzeln verfolge ich diese Diskussion... :-)
P.S. mich wundert, dass Perl fuer dieses "elementare" Problem keine loesung vorsieht...
Schau mal bei perldoc perllocale rein! ;-)
P.P.S
Falls ich natuerlich nur zu Blind fuer das offensichtliche sein sollte nehm' ich das 1. P.S. natuerlich zurueck :)
Gut für Dich *g*
Cheatah
Hi,
mit Schmunzeln verfolge ich diese Diskussion... :-)
P.S. mich wundert, dass Perl fuer dieses "elementare" Problem keine loesung vorsieht...
Schau mal bei perldoc perllocale rein! ;-)
UAARGH!!!
Du immer mit Deinem Spass der Woche....
wieso musste nur ich das Opfer sein?
:P
Bakka
Hi,
P.S. mich wundert, dass Perl fuer dieses "elementare" Problem keine loesung vorsieht...
Schau mal bei perldoc perllocale rein! ;-)
UAARGH!!!
Du immer mit Deinem Spass der Woche....
wieso musste nur ich das Opfer sein?
das Opfer ist immer der, der sich als Opfer fühlt ;-)
Cheatah
Abgesehen von der perllocale-Lösung (Cheatah):
Im sort() kannst Du eine *eigene* Vergleicher-Funktion verwenden.
Diese könnte die beiden Strings nehmen, *lokal* die Ersetzen von ä nach ae vornehmen, *dann* vergleichen und das Ergebnis zurückliefern.
Dann wäre nichts rückgängig zu machen.
Hallo Ihrs!
Abgesehen von der perllocale-Lösung (Cheatah):
Im sort() kannst Du eine *eigene* Vergleicher-Funktion verwenden.
Diese könnte die beiden Strings nehmen, *lokal* die Ersetzen von ä nach ae vornehmen, *dann* vergleichen und das Ergebnis zurückliefern.
Dann wäre nichts rückgängig zu machen.
Richtig so!!
Dummerweise darf man aber nicht $a und $b bearbeiten:
print sort {
my ($a2, $b2)=($a,$b);
$a2=~s/ä/ae/i;
$a2=~s/ö/oe/i;
$a2=~s/ü/ue/i;
$a2=~s/ß/sz/;
$b2=~s/ä/ae/i;
$b2=~s/ö/oe/i;
$b2=~s/ü/ue/i;
$b2=~s/ß/sz/;
$a2 cmp $b2;
} @list;
Die Idee mit dem 'Merken' des Ursprungstrings mit Hilfe von # fand ich auch ganz pfiffig. Aber die ganzen Lösungen mit A1 und dem Umweg über die B75 ... eher amüsant. Aber auch nur deswegen, weil doch das Ziel so klar war: Telefonbuchsortierung. Das heißt dann doch Umlaute ersetzen. Nur halt mit der Nebenbedingung, nicht die eigentlichen Strings zu verändern.
Das ganze hat sich irgenwie als nette Knobelei herausgestellt :)
Jörk