BAKKA: Umlaute sortieren

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

  1. 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

    1. 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

      1. 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

        1. 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 Ä

          1. 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

            1. (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

              1. 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

                1. 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 :)

                  1. 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

                    1. 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
                      ;)

                  2. 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

                    1. 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

                      1. 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

        2. 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.

          1. 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