Vergleich von 2 Arrays, der die Diffrenzen (fehlenden Einträge) auswirft

  • Hallo zusammen ,

    ich schon wieder - aber seit gestern nachmittag kämpfe ich mit meinem Problem und komme(trotz Suche im Forum) nicht so recht weiter.

    Problem:
    ich habe 2 Dateien in denen jeweils das Ergebnis einer Query (spez. Gruppenmitgliedschaften) auf je ein Active Directory stehen.
    Diese lese ich jeweils in ein Array - trim die Einträge, sodass sich diese auf die reinen Gruppennamen redutieren.
    Soweit - sogut

    Jetzt möchte ich die beiden Arrays vergleichen und als Ergebnis angezeigt bekommen, welche Einträge in Array 2 fehlen.
    Wobei Array1 ($aRecordsADS) sozusagen der Master ist - also die Vorgabe ist, gegen das mit dem Array2 ($aRecordsVF) geprüft wird.
    Ergebnis wären dann die in Array2 ($aRecordsVF) nicht vorhandenen Einträge bzw. welche Einträge sind Array1 ($aRecordsADS) mehr vorhanden. (Ich hoffe mal das kann man verstehen).

    Den Teil des Scripts, indem ich auf Fehler laufe , habe mal 'auskommentiert'
    (Wobei ich nicht sicher bin, ob der Ansatz überhaupt so richtig ist)

    Vielleicht weiss ja jemand Rat bzw. kann helfen

    Danke schon einmal im voraus

    [autoit]


    #include <file.au3>
    #include <array.au3>

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

    Dim $aRecordsVF, $aRecords2VF, $aRecordsADS, $aRecords2ADS, $aResult

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

    ;read file1 - sort array - trim records - display array
    If Not _FileReadToArray("adsGroups.txt",$aRecordsADS) Then
    MsgBox(4096,"Error", " Error reading log to Array error:" & @error)
    Exit
    EndIf
    _ArraySort($aRecordsADS)
    for $i = 1 to $aRecordsADS[0]
    $aRecords2ADS = StringSplit(StringReplace($aRecordsADS[$i], "CN=", ""), ",")
    $aRecordsADS[$i] = $aRecords2ADS[1]
    Next
    _ArrayDisplay($aRecordsADS, "Liste Groups ADS")

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

    ;read file2 - sort array - trim records - display array
    If Not _FileReadToArray("vfGroups.txt",$aRecordsVF) Then
    MsgBox(4096,"Error", " Error reading log to Array error:" & @error)
    Exit
    EndIf
    _ArraySort($aRecordsVF)
    for $i = 1 to $aRecordsVF[0]
    $aRecords2VF = StringSplit(StringReplace($aRecordsVF[$i], "CN=", ""), ",")
    $aRecordsVF[$i] = $aRecords2VF[1]
    Next
    _ArrayDisplay($aRecordsVF, "Liste Groups VF")

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

    ;HIER KOMME ICH LEIDER NICHT WEITER - START
    ;Global $r = 0
    ;For $i = 1 To $aRecordsVF[0]
    ; Local $index
    ; $index = _ArraySearch($aRecordsADS, $aRecordsVF[$i])
    ; If $index <> 0 Then
    ; $aResult[$r] = $aRecordsADS[$i]
    ; $r = $r + 1
    ; EndIf
    ;Next
    ;_ArrayDisplay($aResult, "Ergebnis der Suche")
    ;HIER KOMME ICH LEIDER NICHT WEITER - ENDE

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

    ;FEHLERMELDUNG:
    ;==> Subscript used with non-Array variable.:
    ;$aiResult[$r] = $aRecordsVF[$i]
    ;$aiResult^ ERROR

    [/autoit]

    mfg
    ugt100 ?(

    Einmal editiert, zuletzt von ugt100 (15. April 2011 um 09:36)

  • Probiere es mal damit:

    [autoit]


    ; -------------------------------------------------
    ; Function: _ArrayDiff
    ; Purpose: Returns an array of elements from $avArray1 that do not occur in $avArray2
    ; Syntax: _ArrayDiff(ByRef $avArray1, ByRef $avArray2 [, $f_CaseSense = 0])
    ; Where: $avArray1 = ByRef source array
    ; $avArray2 = ByRef array to search for $avArray1 elements
    ; $f_CaseSense (optional) = Case sensitivity as passed to StringInStr()
    ; 0 = not case sensitive, using the user's locale (default)
    ; 1 = case sensitive
    ; 2 = not case sensitive, using a basic/faster comparison
    ; Returns: On success returns an array with [0] = count containing any elements
    ; from $avArray1 that do not occur in $avArray2
    ; If all elements in $avArray1 occur in $avArray2 then [0] = 0
    ; On Failure returns 1-element array [0] = 0 and sets @error.
    ; Author: PsaltyDS on http://www.autoitscript.com/forum
    ; Notes: Similar to PHP array_diff function
    ; --------------------------------------------------
    Func _ArrayDiff(ByRef $avArray1, ByRef $avArray2, $f_CaseSense = 0)
    Local $avRET[1] = [0], $sRET = ""

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

    If (IsArray($avArray1) = 0) Or (UBound($avArray1, 0) <> 1) Then Return SetError(1, 1, $avRET)
    If (IsArray($avArray2) = 0) Or (UBound($avArray2, 0) <> 1) Then Return SetError(1, 2, $avRET)

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

    Local $sArray2 = Chr(1) & _ArrayToString($avArray2, Chr(1)) & Chr(1)

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

    For $n = 0 To UBound($avArray1) - 1
    If Not StringInStr($sArray2, Chr(1) & $avArray1[$n] & Chr(1)) Then $sRET &= $avArray1[$n] & Chr(1)
    Next

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

    If StringLen($sRET) Then
    $sRET = StringTrimRight($sRET, 1)
    $avRET = StringSplit($sRET, Chr(1))
    EndIf

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

    Return $avRET
    EndFunc ;==>_ArrayDiff

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Wenn du es selbst machen willst dann mal als Ansatz:
    Nimm das 1. Array und gehe alle Elemente durch.
    Für jedes dieser Elemente gehe das 2. Array durch und schau ob es darin vorkommt.
    Wenn nicht - lass es dir ausgeben.
    Beispielaufbau:

    [autoit]

    Global $aArr1[10] = [1,2,3,4,5,6, 7,8,9,10]
    Global $aArr2[7] = [1,3,4,5,7,9,10]

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

    For $i1 In $aArr1 ; iteriere Array 1
    $bIsIn = False ; Variable welche nur auf True gesetzt wird wenn in beiden der Eintrag gefunden wurde

    For $i2 In $aArr2 ; iteriere Array 2
    If $i1 = $i2 Then
    $bIsIn = True
    ExitLoop 1
    EndIf
    Next
    If Not $bIsIn Then
    MsgBox(0,"", "Folgender Eintrag ist nicht in beiden Arrays vorhanden:" & $i1)
    EndIf
    Next

    [/autoit]

    Hinweis: So funktioniert es erstmal nur in eine Richtung. Elemente die in Array 2 vorhanden sind welche nicht in Array 1 stehen werden nicht ausgegeben.

  • Hallo AspirinJunkie,

    danke für den Ansatz. Der bringt mich weiter, denn ich habe eigentlich nur eine Richtung zu prüfen (Altes AD ist immer Master - neues AD gilt es auf Vollständigkeit zu prüfen).
    Und genau das kann ich mit Deinem Ansatz ja jetzt tun.


    Super

    mfg
    ugt100 :):):)