Compare im Edit_Fenster

  • Hallo Leutz,

    habe eine Frage. ich habe ein Code, welches mit Powershell Daten abruft und die gelistet in einem Editor aufführt.
    Jede Zeile hat einen Wert. Ich würde jetzt gerne beide Editoren vergleichen und gleiche Einträge löschen.
    Habt Ihr vielleicht einen Tipp?

  • Hallo @littleman,

    Du kannst die jeweiligen Inhalte mit GUICtrlRead auslesen. Ich würde dann wahrscheinlich mit StringReplace oder StringSplit die Zeilen eines Edits ermitteln (anhand von @LF trennen) und dann in einer For .. To-Schleife die Zeilen vergleichen. Also Zeile für Zeile aus dem einen Editfeld mit dem kompletten Text des anderen (If StringinString) vergleichen und wenn ja, dann in beiden mit StringReplace durch nichts ersetzen. (If StringinString kannst du eigentlich auch weglassen und einfach für jede Zeile StringReplace ausführen, sollte das gleiche Ergebnis bringen).

    Grüße autoiter

  • Aber die Ausgabe könnte so aussehen:


    Editor1 Editor2

    Name Name
    Hund Katze
    Katze Hund
    Maus Maus
    Ratte Fisch
    Fisch Kamel


    Ich würde dann wollen, dass das Ergebnis so aussieht

    Editor1 Editor2

    Name Name
    Ratte Kamel
  • Natürlich nicht, was soll ich den dabei lernen. :)
    Aber wenn ich String für String vergleiche, dann vergleiche ich immer die erste Zeile und dann die Zweite Zeile, aber in meinem Beiepiel können die gleichen Werte in unterschiedlicher Reihe stehen.

  • Ich meinte auch jede Zeile des einen Editcontrol mit dem gesamten Text des anderen Control zu vergleichen und dann mit StringReplace den Zeileninhalt, den du gesucht hast (plus @LF) zu löschen.
    Um doppelte Einträge im Editcontrol, das du als "Referenz" benutzt, zu verhindern kannst du es mit StringSplit (am @LF) zu einem Array splitten und mit ArrayUnique die Dubletten löschen. Dann die angesprochene Schleife.
    Ich hoffe das war verständlich? Klingt vllt. wirr, aber es sind wenige Zeilen Code (ein Profi zaubert dir das wahrscheinlich in zwei Zeilen).

    Grüße autoiter

    • Offizieller Beitrag

    Warum nutzt du nicht gleich Powershell für die Abfrage - wenn ich das richtig interpretiere, willst du die Gruppenzugehörigkeit für 2 Member vergleichen. Kommt nur drauf an, ob du die Übereinstimmungen oder Unterschiede suchst.

    Komplexe PS-Skripte lassen sich aus AutoIt heraus super ausführen (wie ich nach zweitägigem K(r)ampf endlich herausgefunden habe). :D

    Spoiler anzeigen

    Edit: zum Vergleich existiert eine eigene AD-Funktion: Compare two users groups membership

  • Habe soweit jetzt die ausgelesenen Werte auf Edit1 in ein Array geschrieben und alles doppelten entfertn. Ausgabe mit _ArrayDisplay($arrayunique) sieht auch gut aus.
    Jetzt kopiere ist die gleichen Werte einfach mal in Edit2 und möchte in der Schleife einzelne Wörter vergleichen, doch er löscht mir alle aus dem Edit2, obwohl ich nur eins geändert habe.

    Bsp aus Edit1 ins Array -> Arra[Hund,Katze,Maus]
    Vergleich jetzt mit dem Text in Edit2

    Vorher

    Hund
    Katze
    Mausxxx


    Nach dem ausführen


    Hund Leer
    Katze Lerr
    Maus Leer


    Meine Umsetzung sollte so aussehen


    xxxx
    xxxx
    Mausxxx
  • Hey @littleman,
    ich war jetzt nicht in der Lage, das ganz nachzuvollziehen. Jedenfalls, kann ich so ohne weiteres nicht die Ergebnisse nachstellen.
    Es würde mich aber nicht wundern, wenn der Fehler mit deiner For-Schleife in Verbindung steht. Immer neu das Control auslesen, neue Werte setzen, neu auslesen. Vielleicht passiert da ein Fehler.

    AutoIt
    For $i = 0 To $arraycount -1
    					$test2=GUICtrlRead($aEdit2)
    					Local $sString = StringReplace($test2,$arrayunique[$i],"xxxx")
    					_GUICtrlEdit_SetText($aEdit2, $sString)
    				Next

    Das ist nicht notwendig. Du musst nur einmal vor der Schleife das Control auslesen. In der Schleife bearbeitest du $test2 indem du die Ergebnisse nicht in einer anderen Variable speicherst, sondern in $test.

    AutoIt
    $test2= StringReplace($test2,$arrayunique[$i],"xxxx")

    Nach der Schleife musst du dann auch nur einmal _GUICtrlEdit_SetText nutzen.

    Grüße autoiter

  • Schau mal @littleman,

    jetzt habe ich es doch mal probiert und festgestellt, dass ich das nicht so hinbekomme, wie gedacht. Bei StringReplace gibt es ja zwei Fälle. Meist möchte man die Zeile mit @LF ersetzen, jedoch nicht in der letzten Zeile. Da fehlt ein abschließendes @LF und es klappt nicht. Daher ist das (so wie ich es mache) etwas hässlich, weil in der Schleife beides je Edit probiert wird..
    Ersetze mal deinen geposteten Code durch unten stehenden. Funktioniert das?


    Lass uns aber noch über deine Variablenbezeichnungen sprechen. Das kannst du natürlich machen, wie du möchtest. Allerdings sollte besser sinnvoll sein, was hinter $ steht. Einmal natürlich ein aussagekräftiger Name. Davor im ersten Buchstaben eine Angabe, des Typs der Variable. Wenn du dich da an Konventionen hältst, hilft das dir später bei Durchsicht, deines eigenen Codes und auch anderen, die sich darin zurechtzufinden versuchen.
    Schau mal hier (ich hoffe englisch ist kein Problem. Ansonsten findest du das bestimmt auch auf deutsch): https://www.autoitscript.com/wiki/Best_coding_practices

    Grüße autoiter

  • Das funktioniert leider nicht wie gewollt.

    Ich habe jetzt beide Werte in ein Array geschrieben.
    Wie kann ich beide Arrays vergleichen und das doppelte rausschmeissen?
    Das wäre die einfachte Möglichkeit, oder?

  • Wie kann ich beide Arrays vergleichen und das doppelte rausschmeissen?

    Eine doppelte For-Schleife (oder While) in der die 1. das 1. Array durchgeht und die 2. das zweite Array.
    Die nichtdoppelten Einträge kopierst du in ein neues Array oder löscht sie aus dem alten heraus. Wenn du sie löscht musst du aufpassen das die Schleife dann nicht crasht weil du out of bounds bist.

  • Nur weil ich meine, das muss doch zu schaffen sein. :D

    Spoiler anzeigen

    Ich würde aber jetzt auch Bugfix Skript nutzen. Das lässt sich sicher besser auf ähnliche Fälle anwenden.

    Grüße autoiter

  • Ich habe es mit der Funktion lösen können.
    Die Funktione habe ich auch hier im Forum gefunden, finde den Beitrag aber nicht :)