Wortanfang Schreibweise

  • Hallo,


    ich möchte folgenden Satz mit AutoIt in die normale Schreibweise umwandeln.


    Quelle

    DIESE ZEILE wURDE mIT AUTOIT pROGRAMMIERT.


    Ziel

    Diese Zeile wurde mit Autoit programmiert.


    Wortanfang (1. Buchstabe) groß = Rest klein

    Wortanfang (1. Buchstabe) klein = Rest klein


    Was ist der einfachste Weg mit AutoIt?

    Ich kenne so eine Funktion von einigen Texteditoren.


    Danke

  • Vielleicht geht es einfacher.


    Gibt es eine Möglichkeit mit AutoIt zu erkenne, ob ein Buchstabe ein Großbuchstabe oder Kleinbuchstabe ist?


    Ich möchte nur umwandeln:


    DIESE = Diese ... weil erste Wort der Zeile

    ZEILE = Zeile ... weil erster Buchstabe groß

    wURDE = wurde ... weil erster Buchstabe klein

    mIT = mit ... weil erster Buchstabe klein

    AUTOIT = Autoit ... weil erster Buchstabe groß

    pROGRAMMIERT = programmiert. ... weil erster Buchstabe klein


    Schritt 1 - Trennzeichen Leerzeichen = die Einzelworte


    Schritt 2 - Erkennung 1. Buchstabe ob groß oder klein (ich weiß nicht, wie das geht)

    ... (edit: eventuell 1. Zeichen nehmen und prüfen mit StringIsLower / StringIsUpper )


    Schritt 3 - alle Buchstaben ab dem 2. Buchstaben klein schreiben (ich weiß nicht, wie das geht)
    ... (edit: eventuell mit _StringProper / Wandelt den ersten Buchstaben aller Wörter in einem String in Großbuchstaben um. Wandelt alle anderen Buchstaben in Kleinbuchstaben um.)


    Gibt es zu 2 und 3 einen Lösungsansatz?


    Ist das ganze zu einfach oder kompliziert geacht?

    Wie ist Eure Meinung?

    • Offizieller Beitrag

    Schritt 1 - Trennzeichen Leerzeichen = die Einzelworte

    StringSplit()

    Schritt 2 - Erkennung 1. Buchstabe ob groß oder klein (ich weiß nicht, wie das geht)

    StringIsLower() StringIsUpper()

    Schritt 3 - alle Buchstaben ab dem 2. Buchstaben klein schreiben (ich weiß nicht, wie das geht)

    StringLower() StringUpper()

  • Hier eine rustikale Variante (RegEx wäre eleganter ;)) :

    AutoIt
    #include <array.au3>
    Global $sString, $sStringNew ,$aArr
    $sString = "DIESE ZEILE wURDE mIT AUTOIT pROGRAMMIERT."
    $aArr    = StringSplit($sString, " ", 2)
    For $i = 0 To UBound($aArr) -1
        $aArr[$i] = StringLeft($aArr[$i], 1) & StringLower(StringLower(StringRight($aArr[$i], StringLen($aArr[$i])-1)))
    Next
    $sStringNew = _ArrayToString($aArr, " ")
    ConsoleWrite($sStringNew & @CRLF)

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Banana_2_Day :

    Die Kernfrage müsste eigentlich lauten : "Welchen Zweck hat das Ganze ?"


    Die Regel

    alle Buchstaben ab dem 2. Buchstaben klein schreiben

    versagt ja bereits bei AutoIt , da Autoit falsch wäre. Funktionsnamen wie z.B. _ArrayToString würden zu _arraytostring usw.

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Hier eine rustikale Variante (RegEx wäre eleganter ;) ) :

    Danke. Kannst Du eine RegEx Variante mit reinstellen.


    Die Kernfrage müsste eigentlich lauten : "Welchen Zweck hat das Ganze ?"

    Viele Markennamen und Firmennamen werden in Großbuchstaben geschrieben.


    Beim Speichern von Texten möchte ich lieber eine normale Schreibweise.


    Also aus KAUFLAND soll Kaufland werden.


    Es wäre verschmerzlich, wenn Autoit mit kleinem i geschrieben wird :)


    Auch bei anderen Worten ist es häufiger so, dass sie nur in Großbuchstaben geschrieben werden.


    Es geht um bessere Lesbarkeit.


    FÜR MICH IST DIESER SATZ SCHWERER LESBAR UND ERINNERT AN SCHREIEN ;)

  • Ich würde einen anderen Ansatz nehmen.

    Es gibt dictionary files. Mit diesen würde ich alle Worte im text lowercase vergleichen und dann das passende Wort nehmen.

    Dementsprechend mit dem dictionary file, was ich für ein Wortfinde/Buchstabensalatpuzzle nutze (ca. 1,7 millionen worte) kann man das recht gut umsetzen:

    Auszug aus dem dictionary:

    Dann den Code etwa so:

    - Satz in Wörter splitten

    - Für jedes Wort: lowercase vergleich des Wortes mit dem Dictionary, wenn es gefunden wird das original Wort aus dem Dictionary eingefügt, ansonsten mit dem Ansatz, den du hast das Wort anpassen.


    (Ich weiß grad nicht mehr, wo ich das dictionary her habe, ich hatte ne weile gesucht. Wenn du es haben möchtest kann ich dir nen Link per PM schicken)

    Ich würde aber aus performance gründen eher nicht AutoIt verwenden. In dem Wortfindepuzzle dauert es mit Java etwa 1-2 Minuten, wenn ich ein 50x50 feld mit 1000 zufälligen, unterschiedlichen Wörtern mit mind. länge 3 füllen will. (8 Richtungen; horizontal, vertikal und diagonal, vorwärts und rückwärts) Ich will nicht wissen, wie lange AutoIt dafür brauchen würde, da dabei jede mögliche Position für jedes zufällige Wort in zufälliger Reihenfolge durchgegangen wird, ob es irgendwo hinpasst; solange, bis die X Wörter untergebracht sind oder alle Wörter durchgegangen wurden.


    MfG Kanashius

  • Beim Speichern von Texten möchte ich lieber eine normale Schreibweise.

    Das Problem besteht darin, ein möglichst genaues Regelwerk für die Verarbeitung aufzustellen.


    In meinem Beispiel (s.o.) habe ich nur die einzelnen Worte mittels StringSplit und dem Leerzeichen als Delimiter in ein Array geschrieben.

    Anschließend wurde jedes Arrayelement wie folgt bearbeitet :

    - der erste Buchstabe des Wortes bleibt wie er ist

    - ab dem 2. Buchstaben wird alles in Kleinschrift gesetzt


    Nun kommen aber auch schon die Sonderfälle :

    1. Worte, die am Satzanfang stehen, müssen immer mit einem Großbuchstaben beginnen.

    Beispiel : Dies ist Satz 1.

    ==> bei dies ist Satz 1. würde die jetzige Regel versagen


    2. Der Text geht über mehrere Sätze :

    Beispiel : Bei Dies ist Satz 1.Dies ist Satz 2. -> kein Leerzeichen nach dem Punkt

    ==> hier wäre das Leerzeichen als Delimiter nicht ausreichend. Nimmt man den Punkt als zusätzlichen Delimiter mit 'rein, dann hätte man Probleme bei z.B. Die Website www.autoit.de ist genial.


    3. 'Schreien' :

    Beispiel : FÜR MICH IST DAS FÜR DIE KATZ.

    ==> auch hier versagt die jetzige Regel. Einige Worte müssten komplett in Kleinschrift umgewandelt werden, andere nicht. Aus dem FÜR am Satzanfang müsste Für gemacht werden. Aus dem FÜR in der Satzmitte aber für


    4. Firmen- und Markennamen umsetzen :

    ==> aus z.B. BASF -> Basf zu machen, sieht auch irgendwie Scheiße aus, oder ? ;)


    usw.usw.


    Ich würde daher, wie von Oscar angesprochen, eine Liste von Worten erstellen, die man für die Ersetzung heranzieht.


    Wie ich gerade sehe, hat zwischenzeitlich auch Kanashius geantwortet. In seinem Beitrag schlägt er ebenfalls ein Wörterbuch vor und weist zudem auf das Problem der Verarbeitungsgeschwindigkeit (speziell bei AutoIt) hin.


    Banana_2_Day : Mein Fazit

    Schraube Deine Anforderungen herunter.

    Erstelle eine eigene (stark verkürzte) Liste von Worten, die Dich besonders stören.

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Ich will nicht wissen, wie lange AutoIt dafür brauchen würde, da dabei jede mögliche Position für jedes zufällige Wort in zufälliger Reihenfolge durchgegangen wird, ob es irgendwo hinpasst; solange, bis die X Wörter untergebracht sind oder alle Wörter durchgegangen wurden.

    Naja, eine unsortierte Textdatei durchsucht auch kein Mensch...Indizieren ist das Stichwort!

    Ich habe auch irgendwo ein "Wörterbuch" rumfliegen als Textdatei. Das aber in eine Datenbank zu schreiben war imho nur ein Dreizeiler. In der DB ist das Wort indiziert und innerhalb von Mikrosekunden gefunden. Auch mit AutoIt!

  • Zur "ersten" Lösungsvariante von Musashi... Ich würde mal behaupten, dass das mit RegEx in AutoIt nicht eleganter zu lösen ist.


    AutoIt unterstützt leider keine Case Conversion bei RegExpReplace. Warum auch immer, PCRE kann das eigentlich.

    Wenn das so wäre, könnte man das mit nem recht einfachen Pattern lösen:


    Pattern: \h*(?:(?:([a-z][A-Z]+))|(?:([A-Z])([A-Z]*)))(\h*)

    Replace: \L$1\U$2\L$3$4


    Beispiel bei RegEx101


    Zur Datenbank... Das wird aber relativ aufwendig, wenn auch Markennamen davon erkannt werden sollen. Oder?