Adressen/Städtenamen von Umlauten befreien

  • Hi all,

    ich probiere schon seit Stunden rum, komm aber auf keine gescheite Lösung.

    Und zwar habe ich eine Excelliste mit diversen Adressen und Städtenamen, die Umlaute enthalten. Die möchte ich durch jeweils z.b. für "Ä" -> "Ae" ersetzen.
    Das klappt auch soweit, aber es gibt dann noch das Problem, dass es Ausnahmen gibt z.b. "KöLN" -> "KoeLN" und das sieht echt besch... aus :)

    Meine Idee war es, das ganze mit "StringRegExpReplace" zu lösen, allerdings will das nicht so wirklich (liegt wohl dran, dass ich davon noch absolut 0 Plan habe).

    [autoit]


    ;~ Alle möglichen Fälle: KÖLN, KöLN, köln, kÖln, ÖLN, öLN, Öln, öln => KOELN, KOELN, koeln, koeln, OELN, OELN, oeln, oeln

    [/autoit][autoit][/autoit][autoit]

    $repcell = "KöLN"

    [/autoit][autoit][/autoit][autoit]

    $repcell = StringRegExpReplace($repcell,"(?i)\bÖ","OE")
    $repcell = StringRegExpReplace($repcell,"(?i)\BÖ","oe")
    $repcell = StringRegExpReplace($repcell,"(?i)\bö","oe")
    $repcell = StringRegExpReplace($repcell,"(?i)\Bö","Oe")

    [/autoit][autoit][/autoit][autoit]

    msgbox(0,"",$repcell)

    [/autoit]

    (ist schon recht zerpflückt, funktioniert also nicht mehr wirklich)

    Ich bin mir sicher, dass es hier jemanden gibt, der das hin bekommt :)

    Grüßle
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

    Einmal editiert, zuletzt von x0r (12. Januar 2012 um 20:48)

  • Hi,

    funktioniert nicht :)

    da er sonst z.b. "Öln" in "oeln" ändert, der erste Buchstabe soll aber groß sein!

    "StringReplace" ists wurscht, ob der Buchstabe groß oder klein ist ;)

    (Umlaute am Anfang z.b. bei "Bad Oeynhausen" / "Bad Öynhausen")

    Ob mans tatsächlich so schreibt oder nicht, ist unwichtig, da ich bei diesem Ort in der Excelliste ein "Ö" stehen hab :)

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Hallo x0r.

    du solltest dir die Hilfe zu StringReplace anschauen, denn es kann sehr wohl Gross- und Kleinschrebung unterscheiden. Dazu musst du allerdings diesen Parameter auch benutzen,

    mfg autoBert

  • Hi autoBert,

    gut, das mag schon sein, das löst aber leider mein Problem der verschiedenen Fälle (siehe oben im Code) nicht.

    Denn ich möchte ja nicht bei "KÖLN" -> "KOeLN" rauskriegen, sondern "Koeln".
    Andersrum aber bei "Bad Öynhausen" -> "Bad Oeynhausen" und nicht "Bad OEynhausen".

    Ich glaube, ich habe meinen Beitrag schon recht verständlich verfasst und mein Problem wird ersichtlich...

    Gruß
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Wieso steht in deiner Exel Tabelle überhaupt 'KöLN' dass ist doch völlig banane .. man schreibt doch entweder 'KÖLN' oder 'Köln' aber doch nicht Groß dann klein dann wieder Groß .. und du kannst es mit StringReplace lösen in dem du einfach die alles ersetzen lässt dann mit StringLeft dir den ersten Buchstaben auswählst und diesen mit StringUpper(Glaube so heißt die Funktion) einfach zu einem Großbuchstaben machst und den String dann wieder zusammenführen , fertig

    Gruß Marvin

  • Hi Protex,

    die Möglichkeit habe ich bereits in Betracht gezogen, aber was tun bei "Ortsname (Ortsteil-Anhang)" oder "Bad-Xyz"?

    Da ist das ganze nicht mehr so einfach mit StringLeft() & StringRight() und es gibt noch diverse andere Schreibweisen von diesen Namen.

    Es soll ja auch nicht 100 Zeilen Code werden, nur was kleines/kompaktes - drum dachte ich eben, es ginge mit RegEx perfekt!

    P.S.: Was weiss ich, welcher Depp die Namen so blöd geschrieben hat :D
    Edit: Ich bin nur der Depp, ders ausbaden darf ;)

    Gruß
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Dann schreib dir doch lieber mal ein kleines Tool was deine Datenbank ausräumt ;) und dann sind die Probleme für dich schon mal gegessen + für deine eventuellen Nachfolger weil so eine Datenbank kann doch kein mensch gebrauchen.. ich würde meinen Kollegen was erzählen wenn die mir so einem Müll unter die Nase halten würden..

    Gruß Marvin

  • Im Prinzip funktionierts ja schon ganz ordentlich, hatte es mit:

    [autoit]


    StringRegExpReplace($repcell,chr(214),"Oe") ;Ö
    ;und
    StringRegExpReplace($repcell,chr(246),"oe") ;ö

    [/autoit]

    Nur hierbei wie gesagt das Problem von wegen: Name groß und mitten im Namen ein kleiner Umlaut...

    btw: Es ist im eigentlichen Sinn keine Datenbank, sondern eine Art Report an den Kunden (bearbeiteten Originaldaten) - Nur soll da halt alles verbessert sein, frag mich nicht warum, finds selber total schwachsinnig.

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Naja also eine andere Möglichkeit wäre den gesamten String klein zu machen dann zu bearbeiten dann den Anfang Groß oder sowas in der Art aber wenn sich alle Strings die aus dem System kommen jedes mal unterschieden dann weiß ich nicht wie man dass lösen soll also 'Ordentlich' lösen soll

    Gruß Marvin

  • Mit RegEx gehts doch bestimmt :D

    Da kann man doch Prüfen, ob z.b. "ö" der Wortanfang ist oder nicht - hab ich gelesen! (und ausprobiert, Scriptversuche siehe oben ^^)

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • ich habe dir mal eine Funktion geschrieben, die das macht ;)

    Spoiler anzeigen
    [autoit]


    ConsoleWrite(_KonvertName("KöLN") & @CRLF)
    ConsoleWrite(_KonvertName("Bad Öynhausen") & @CRLF)
    ConsoleWrite(_KonvertName("BdäfO lalala Äätestö ÜÄÖ") & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    Func _KonvertName($sStadtName)
    Local $sStadt_Teil1, $sStadt_Teil2, $aStadt_Split, $i, $sReturn = ""

    [/autoit] [autoit][/autoit] [autoit]

    ; prüfen ob Leerzeichen enthalten
    $aStadt_Split = StringSplit($sStadtName, " ")
    If @error Then
    ; ersetzen der Umlaute
    $sStadtName = StringReplace($sStadtName, "ä", "ae")
    $sStadtName = StringReplace($sStadtName, "ö", "oe")
    $sStadtName = StringReplace($sStadtName, "ü", "ue")

    [/autoit] [autoit][/autoit] [autoit]

    ; ersten Buchstaben nehmen und groß machen
    $sStadt_Teil1 = StringUpper(StringLeft($sStadtName, 1))
    ; restliche Buchstaben nehmen und klein machen
    $sStadt_Teil2 = StringLower(StringTrimLeft($sStadtName, 1))

    [/autoit] [autoit][/autoit] [autoit]

    ; Teil 1 und 2 zusammen setzen
    $sStadtName = $sStadt_Teil1 & $sStadt_Teil2

    [/autoit] [autoit][/autoit] [autoit]

    Return $sStadtName ; ergebniss zurückgeben
    Else
    ; jedes gesplittete Item bearbeiten
    For $i = 1 To $aStadt_Split[0] Step 1
    ; umlaute ersetzen
    $aStadt_Split[$i] = StringReplace($aStadt_Split[$i], "ä", "ae")
    $aStadt_Split[$i] = StringReplace($aStadt_Split[$i], "ö", "oe")
    $aStadt_Split[$i] = StringReplace($aStadt_Split[$i], "ü", "ue")

    [/autoit] [autoit][/autoit] [autoit]

    ; groß / klein schreibung des wortes
    $sStadt_Teil1 = StringUpper(StringLeft($aStadt_Split[$i], 1))
    $sStadt_Teil2 = StringLower(StringTrimLeft($aStadt_Split[$i], 1))

    [/autoit] [autoit][/autoit] [autoit]

    ; an Variable anhängen und nächstes element bearbeiten
    $sReturn &= $sStadt_Teil1 & $sStadt_Teil2 & " "
    Next
    ; letzes Leerzeichen entfehrnen und ergebniss zurückgeben
    Return StringTrimRight($sReturn, 1)
    EndIf
    EndFunc

    [/autoit]

    die ersetzt alles so, wie du sagtest
    habe kommentare eingebaut, die dir helfen den code zu verstehen

    hoffe das hilft dir :)

    mfg

  • Hi Krabat,

    danke für das Teil, kriegst ein "Sehr geil" von mir dafür! :D

    ABER: wie gesagt, es gibt auch Städtenamen die so aussehen -> "Ort (Ortsteil-Blubb)" <- und da funktioniert das leider nicht mehr ganz
    ebenso bei "Ort-Name" (kein Leerzeichen enthalten).

    Vielleicht fällt mir jetzt beim Mittagsschläfchen eine Lösung ein, wäre nicht das erste Mal :P

    Gruß
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Warun so umständlich? So geht's auch:

    [autoit]

    #include <Array.au3>
    #include <String.au3>

    [/autoit][autoit][/autoit][autoit]

    Global $aNames[3]
    $aNames[0] = 'KöLN'
    $aNames[1] = 'Bad Öynhausen'
    $aNames[2] = 'Frankfurt-nied'
    _ArrayDisplay($aNames,"Original")

    [/autoit][autoit][/autoit][autoit]

    for $i = 0 to UBound($aNames) -1
    $aNames[$i]=StringReplace($aNames[$i],"ö","oe")
    $aNames[$i]=StringReplace($aNames[$i],"ä","ae")
    $aNames[$i]=StringReplace($aNames[$i],"ü","ue")
    $aNames[$i] =_StringProper($aNames[$i])
    Next
    _ArrayDisplay($aNames,"Gewandelt")

    [/autoit]

    mfg autoBert

  • das ist auch kein Problem, muss man nur wenige zeilen code hinzufügen :)

    Spoiler anzeigen
    [autoit]


    ConsoleWrite(_KonvertName("KöLN") & @CRLF)
    ConsoleWrite(_KonvertName("Bad Öynhausen") & @CRLF)
    ConsoleWrite(_KonvertName("Frankfurt-nied") & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    Func _KonvertName($sStadtName)
    Local $sStadt_Teil1, $sStadt_Teil2, $aStadt_Split, $i, $sReturn = "", $iSplittMode = 0

    [/autoit] [autoit][/autoit] [autoit]

    ; prüfen ob Leerzeichen enthalten
    $aStadt_Split = StringSplit($sStadtName, " ")
    If @error Then
    $aStadt_Split = StringSplit($sStadtName, "-")
    $iSplittMode = 1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $aStadt_Split[0] = $sStadtName Then
    ; ersetzen der Umlaute
    $sStadtName = StringReplace($sStadtName, "ä", "ae", 1)
    $sStadtName = StringReplace($sStadtName, "ö", "oe", 1)
    $sStadtName = StringReplace($sStadtName, "ü", "ue", 1)

    [/autoit] [autoit][/autoit] [autoit]

    ; ersten Buchstaben nehmen und groß machen
    $sStadt_Teil1 = StringUpper(StringLeft($sStadtName, 1))
    ; restliche Buchstaben nehmen und klein machen
    $sStadt_Teil2 = StringLower(StringTrimLeft($sStadtName, 1))

    [/autoit] [autoit][/autoit] [autoit]

    ; Teil 1 und 2 zusammen setzen
    $sStadtName = $sStadt_Teil1 & $sStadt_Teil2

    [/autoit] [autoit][/autoit] [autoit]

    Return $sStadtName ; ergebniss zurückgeben
    Else
    ; jedes gesplittete Item bearbeiten
    For $i = 1 To $aStadt_Split[0] Step 1
    ; umlaute ersetzen
    $aStadt_Split[$i] = StringReplace($aStadt_Split[$i], "ä", "ae", 1)
    $aStadt_Split[$i] = StringReplace($aStadt_Split[$i], "ö", "oe", 1)
    $aStadt_Split[$i] = StringReplace($aStadt_Split[$i], "ü", "ue", 1)

    [/autoit] [autoit][/autoit] [autoit]

    ; groß / klein schreibung des wortes
    $sStadt_Teil1 = StringUpper(StringLeft($aStadt_Split[$i], 1))
    $sStadt_Teil2 = StringLower(StringTrimLeft($aStadt_Split[$i], 1))

    [/autoit] [autoit][/autoit] [autoit]

    ; an Variable anhängen und nächstes element bearbeiten
    If $iSplittMode = 0 Then
    $sReturn &= $sStadt_Teil1 & $sStadt_Teil2 & " "
    Else
    $sReturn &= $sStadt_Teil1 & $sStadt_Teil2 & "-"
    EndIf
    Next
    ; letzes Leerzeichen entfehrnen und ergebniss zurückgeben
    Return StringTrimRight($sReturn, 1)
    EndIf
    EndFunc

    [/autoit]


    jetzt macht er es auch wenn ein bindestrich drinn ist
    jedoch darf kein Bindestruch UND leerzeichen da sein ;)

    mfg

    EDIT: war ein Fehler drinn, ist korrigiert :)

    autoBert: hab mit die Funktion mal angeguckt, ja die tuts auch ;)

    Einmal editiert, zuletzt von Krabat (12. Januar 2012 um 14:39)

  • autoBert:

    Sorry, wenn ich dir evtl zu nahe trete, aber liest du überhaupt die Beiträge komplett?

    Edit:

    1. Ortsname (groß, klein, gemischt)
    2. Wenn groß, groß lassen, Umlaute ersetzen (und zwar OE und nicht Oe)
    3. Wenn klein, erster Buchstabe groß, Umlaute ersetzen
    4. Wenn gemischt, siehe 3.
    5. Wenn erster Buchstabe Umlaut, dann ersetzen (und zwar Oe und nicht OE (und natürlich hier auch wieder auf komplett groß oder klein achten!)

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • jetzt macht er es auch wenn ein bindestrich drinn ist
    jedoch darf kein Bindestruch UND leerzeichen da sein ;)

    das widerum ineressiert

    [autoit]

    _StringProper

    [/autoit]

    nicht der 1. Buchstabe wird Grossbuchstabe, alle anderen klein, siehe dazu https://autoit.de/index.php?page…4184#post244184

    @autoBert:Sorry, wenn ich dir evtl zu nahe trete, aber liest du überhaupt die Beiträge komplett?

    Testest du überhaupt die Empfehlungen?

    mfg autoBert

  • OK!

    Jetzt hab ichs getestet und hab rausgefunden (was ich natürlich zuvor schon gesehen habe), dass der Code von Krabat mit dennoch nicht die großen Ortsnamen groß lässt.

    Egal..

    Ich bedanke mich herzlich bei Krabat für seine Mühe! :D

    MfG
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • wie meinst du das jetzt?

    soll bei KöLN das LN weiterhin groß bleiben oder wie meinst du das? ;)
    dazu musst du nur in Zeile 24 und 40 das StringLower() entfehrnen

    ach keine große sache^^

    PS: hatte ein fehler im script, ist korrigiert
    siehe beitrag oben
    PPS: das script von autoBert macht doch das selbe meine funktion, nur besser ;)