doppelte Worte aus Zeichenkette entfernen - von links beginnen

  • Hallo,

    Quelle

    das ist ein Hund\das ist eine Banane\das ist eine Katze\das ist ein Kakadu

    Ziel

    Hund\Banane\eine Katze\das ist ein Kakadu

    Ich möchte von links beginnen und jedes Wort löschen, welches rechts vom aktuellen Begriff vorhanden ist.

    Alle doppelten Worte sollen entfernt werden.

    Achtung - der Backslash muss im Text und die Wortreihenfolge erhalten bleiben.

    Wie kann ich das elegant umsetzen?

  • Generell:

    Trenne alle einzelnen Strings auf (Separator bzw. Delimiter ist dann "/") und speichere sie z.B. in einem array

    Dann gehst du das array durch und prüfst ob die einzelnen Worte nochmal irgendwo im array vorkommen (StringInStr), und löscht dann ggf.

    Danach kannst du den Rest wieder zusammen setzen und auch den "/" wieder hinzufügen.

  • Dann gehst du das array durch und prüfst ob die einzelnen Worte nochmal irgendwo im array vorkommen (StringInStr), und löscht dann ggf.

    Danke für den Hinweis, die Idee hatte ich zuvor ausgetestet.

    Gehen wir davon aus, dass ich die Textzeile als Array gesplittet habe.
    Mit der ersten For / Next Schleife durchlaufe ich das Array.

    Ab da wird es für mich kompliziert.

    Wie setze ich die Schleife so fort, dass ich nach einem gefundenen Element weiter suche, das vorherige Element lösche und dann weitersuche?

    Wenn ich ein doppeltes Element gefunden und gelöscht habe, dann hat das Array eine andere Größe - die erste For/Next Schleife funktioniert nicht mehr, da diese von x Elementen und nicht x minus gelöschte Elemente ausgeht.

    Auch weiß ich nicht, wie ich die Schleifen so ineinanderlege, dass das kein Kuddel Muddel wird.

    Ich scheitere an der mehrfachen Verschachtelung und der Neuberechnung des Arrays.

    Hast Du ein Beispiel dafür, wie es funktionieren könnte?

  • Stopp :)

    Splittest deinen string auf in ein Array (Trenner ist das "/" ).

    Ausgang:

    das ist ein Hund\das ist eine Banane\das ist eine Katze\das ist ein Kakadu

    Ergebnis:

    $aArrayA[1] = das ist ein Hund

    $aArrayA[2] = das ist eine Banane

    $aArrayA[3] = das ist eine Katze

    $aArrayA[4] = das ist ein Kakadu

    Dann startest du mit dem ersten Teil ($aArrayA[1]) und splittest diesen (Trenner ist das " " )

    Ausgang:

    das ist ein Hund

    Ergebnis:

    $aArrayB[1] = das

    $aArrayB[2] = ist

    $aArrayB[3] = ein

    $aArrayB[4] = Hund

    Und dann prüfst du durch.

    Keine Garantie auf Funktion und nur ein Beispiel:

    Einmal editiert, zuletzt von Moombas (29. Oktober 2019 um 14:57)

  • Sowas?

  • Sowas?

    Hallo Water,

    im Prinzip ja, nur soll das letzte Wort erhalten bleiben. Von links ausgehend lesen und löschen - das Wort am weitesten rechts bleibt erhalten. Siehe mein Beispiel aus Post 1.

    Bei Deinem Script bleibt jeweils das erste Wort erhalten.

    Row0 Word1

    Row 1 Word2

    Row2 \

    Row 3 Word3

    Row 4 \

    Row 5 Word4

    Ich möchte, dass doppelte Worte von links ausgehend gelöscht werden.

    Gesuchtes Ergebnis ist:

    Row0 Word1

    Row 1 \

    Row 2 Word2

    Row 3 \

    Row 4 Word3

    Row 5 Word4

    oder um mein Beispiel von oben zu nehmen - hier als Formel für das Script

    Global $aArray[] = [ "das", "ist", "ein", "Hund", "\", "das", "ist", "eine", "Banane", "\", "das", "ist", "eine", "Katze", "\", "das", "ist", "ein", "Kakadu" ]

    Ergibt mit Deinem Script noch :) nicht

    richtig wäre:

    Hund

    \

    Banane

    \

    eine

    Katze

    \

    das

    ist

    ein

    Kakadu


    sondern (falsch)

    das

    ist

    ein

    Hund

    \

    eine

    Banane

    \

    Katze

    \

    Kakadu


    Kannst Du Dein Script so abändern, dass die Doubletten von links ausgehend gelöscht werden? Vielen Dank für die bisherige Hilfe!

    Einmal editiert, zuletzt von Banana_2_Day (29. Oktober 2019 um 15:35)

  • Versuch #2:

  • Oder (kürzer) so:

  • Versuch #2:

    wow - Treffer und versenkt. Danke!

    Du durchläufst das Array rückwärts .... setzt doppelte Werte auf "~~" ... aber wie genau?

    Kannst Du den Teil kurz erklären?

    Wie findest Du die doppelten Einträge?

    Im 2. Schritt werden alle Array-Einträge,die "~~" entsprechen, gelöscht. Richtig?

  • Hier mein Lösungsvorschlag:

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    Einmal editiert, zuletzt von UEZ (31. Oktober 2019 um 09:02)

  • Zitat

    Du durchläufst das Array rückwärts .... setzt doppelte Werte auf "~~" ... aber wie genau?

    Kannst Du den Teil kurz erklären?

    Wie findest Du die doppelten Einträge?

    Im 2. Schritt werden alle Array-Einträge,die "~~" entsprechen, gelöscht. Richtig?

    Richtig. Ich gehe von rechts nach links durch und prüfe für jedes Wort ob es weiter links (bis zum ersten Wort) nochmals vorkommt. Falls ja, wird es markiert und im zweiten Schritt gelöscht.

  • Als Einzeiler könnte es so aussehen:

    AutoIt
    MsgBox(0,"",StringRegExpReplace("das ist ein Hund\das ist eine Banane\das ist eine Katze\das ist ein Kakadu", '(\b\w+\b\s?)(?=.+\1)', ''))

    Cool:!:

    :thumbup:

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Als Einzeiler könnte es so aussehen :

    MsgBox(0,"",StringRegExpReplace("das ist ein Hund\das ist eine Banane\das ist eine Katze\das ist ein Kakadu", '(\b\w+\b\s?)(?=.+\1)', ''))

    Vorab erst einmal den :thumbup:. Immer wieder verrückt, was man mit RegEx so machen kann ^^.

    Fügt man allerdings ein Element hinzu, hier \das ist kein Hummer , dann lautet die Ausgabe :

    Hund\Banane\eine Katze\Kakadu\das ist kein Hummer

    Müsste es nicht aber wie folgt aussehen ? :

    Hund\Banane\eine Katze\ein Kakadu\das ist kein Hummer

    EDIT :

    (Zur Sicherheit, damit es nicht falsch 'rüberkommt. Das ist eine Frage - keinesfalls eine Kritik ;) ! )

    Gruß Musashi

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

    Einmal editiert, zuletzt von Musashi (31. Oktober 2019 um 00:08)

  • Fügt man allerdings ein Element hinzu, hier \das ist kein Hummer , dann lautet die Ausgabe :

    Hund\Banane\eine Katze\Kakadu\das ist kein Hummer

    Müsste es nicht aber wie folgt aussehen ? :

    Hund\Banane\eine Katze\ein Kakadu\das ist kein Hummer

    Hm interessant - er übernimmt nicht die Word-Boundarys als Teil der Matches weswegen er dann das "ein" beim matchen wieder innerhalb von "kein" findet.
    (Er geht hierbei schrittweise von hinten nach vorn). Die Word-Boundary als Bedindung hat er dabei aber schon vergessen und prüft die gar nicht mehr, weswegen das "k" von "kein" ignoriert wird.
    Daher muss man die Word-Boundarys explizit wieder mit reinnehmen - dann klappt es auch:

    AutoIt
    MsgBox(0,"",StringRegExpReplace("das ist ein Hund\das ist eine Banane\das ist eine Katze\das ist ein Kakadu\das ist kein Hummer", '(\b\w+\b\s?)(?=.+\b\1\b)', ''))