array search - Werte aus Spalten vergleichen - Array´s vergleichen

  • Hallo

    Ich möchte 2 Arrays vergleichen und die Werte , die in beiden Array´s vorkommen ,im ersten Array löschen.
    Alternativ habe ich die Array´s in ein 2 D Array zusammengeführt und Arraysearch benutzt.

    Das Problem ist , das das zweite Array kleiner als das erste ist. ?(
    Mit Arraysearch wollte ich jetzt den Index bestimmen, leider ohne erfolg.
    Mit der Funktion : _GetIntersection konnte ich zwar die Gemeinsamkeiten bestimmen können, aber nicht die Werte , die in der zweiten Spalte sind , in der ertsen Spalte löschen.

    Mein Ansatz sieht so aus.

    #include <Array.au3>

    $index=""

    dim $array[9][2]
    $array[0][0]="pc1"
    $array[0][1]="00"
    $array[1][0]="pc2"
    $array[1][1]="01"
    $array[2][0]="pc3"
    $array[2][1]="04"
    $array[3][0]="pc4"
    $array[3][1]="pc1"
    $array[4][0]="pc5"
    $array[5][0]="01"
    $array[6][0]="pc6"
    $array[7][0]="pc7"
    ;_ArrayDisplay($array,"")

    For $i = 0 to UBound ($array)-1
    $index=_ArraySearch($array[$i][0],$Array[$i][1],0,0,0,1,1,2)
    MsgBox(0,"",$index)
    Next


    Das klappt einfach nicht , hat jemand eine Idee ?

    Vielen Dank

    Gruß

    Lars

    Einmal editiert, zuletzt von lars_k (21. Dezember 2010 um 10:32)

    • Offizieller Beitrag

    @Milla, _ArrayUnique funzt nur bei 1D Arrays. ;)

    • Offizieller Beitrag

    Ok, du hast Recht.

    Die Beschreibung ist aber für den A.... :cursing:

    Zitat

    Returns the Unique Elements of a 1-dimensional array.

    Obwohl es eigentlich mit dm 1D stimmt, das Rückgabearray ist ein 1D Array.
    Will man alle Unique Array Elemete aus einem 2D Array haben bleibt einem nicht anderes als eine Eigenlösung zu basteln. :thumbup:

  • Ansonsten wäre hier noch der Fußweg:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Global $arr1[5], $arr2[3], $newArr[1]

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

    $arr1[0] = 1
    $arr1[1] = 2
    $arr1[2] = 3
    $arr1[3] = 4
    $arr1[4] = 5

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

    $arr2[0] = 2
    $arr2[1] = 4
    $arr2[2] = 5

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

    For $i = 0 To UBound($arr1) - 1 Step 1
    If _ArraySearch($arr2, $arr1[$i]) == -1 Then
    _ArrayAdd($newArr,$arr1[$i])
    $newArr[0] += 1
    EndIf
    Next
    _ArrayDisplay($newArr)

    [/autoit]
  • So?

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Global $a1[7] = ["pc2", "pc3", "pc4", "pc5", "01", "pc6", "pc7"]
    Global $a2[4] = ["00", "01", "04", "pc1"]

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

    For $i = UBound($a1) -1 To 0 Step -1
    For $x in $a2
    If $a1[$i] == $x Then
    _ArrayDelete($a1, $i)
    ContinueLoop 2
    EndIf
    Next
    Next

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

    _ArrayDisplay($a1, "$a1 nach Behandlung")

    [/autoit]

    oder bisschen einfacher geschrieben:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Global $a1[7] = ["pc2", "pc3", "pc4", "pc5", "01", "pc6", "pc7"]
    Global $a2[4] = ["00", "01", "04", "pc1"]

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

    For $i = UBound($a1) - 1 To 0 Step -1
    If _ArraySearch($a2, $a1[$i]) <> -1 Then _ArrayDelete($a1, $i)
    Next

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

    _ArrayDisplay($a1, "$a1 nach Behandlung")

    [/autoit]

    Einmal editiert, zuletzt von AspirinJunkie (20. Dezember 2010 um 11:19)

  • Hallo AspirinJunkie

    Erstmal Danke für Deine Mühe.
    Leider klappt dieses nicht mit meinen Array´s ( Siehe Bilder )
    A1= http://img148.imageshack.us/i/25018858.jpg
    A2= http://img31.imageshack.us/i/88528463.jpg

    Index= http://img524.imageshack.us/i/nachhers.jpg

    Hier der Scriptteil:

    _ArrayDisplay($a1,"A1")
    _ArrayDisplay($a2,"A2")
    For $i = UBound($a1) -1 To 0 Step -1
    For $x in $a2

    $1=_ArraySearch($a2[$x], $a1[$i])
    if $1 <> -1 Then _ArrayDelete($1, $i)
    MsgBox(0,"","A1 : "&$a1[$i]&@cr&"Index Arraysearch : "&$1&@cr&"A2 : "&$a2[$x])
    Next
    Next

    Hast DU eine Idee ?
    Danke und Gruß

    Lars

  • ?:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Global $a1[3] = ["larsi", "test", "testordner"]
    Global $a2[1] = ["testordner"]

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

    For $i = UBound($a1) - 1 To 0 Step -1
    If _ArraySearch($a2, $a1[$i]) <> -1 Then _ArrayDelete($a1, $i)
    Next

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

    _ArrayDisplay($a1, "$a1 nach Behandlung")

    [/autoit]
  • Ich bekomme die Array´s aus einer Abfrage zurück.
    Wenn ich die Werte manuell eingebe funktioniert es.
    Ansonsten bekomme ich bei Arraysearch immer -1 zurück

    ????

  • nehm doch mal in $a2 noch "test" als 2. Wert auf und es wird nichtmehr klappen

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Global $a1[3] = ["larsi", "test", "testordner"]
    Global $a2[2] = ["testordner", "test"]

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

    For $i = UBound($a1) - 1 To 0 Step -1
    If _ArraySearch($a2, $a1[$i]) <> -1 Then _ArrayDelete($a1, $i)
    Next

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

    _ArrayDisplay($a1, "$a1 nach Behandlung")

    [/autoit]

    Was klappt da nun nicht?

    @lars_k
    Dann zeig mal dein ganzes Skript.

  • ah sorry hatte mich vertan...is ja To 0 und nicht To Ubound($a1) - 1 ... sollte vllt mal genau hinschauen^^

  • Hallo

    AspirinJunkie
    Es klappt.
    Ich hatte zum String teilen noch ein Leerzeichen , welches den Fehler verursacht hat.

    Danke an alle für die Hilfe.

    Gruß

    Lars

    Hier ist ein Teilauszug aus meinem Script.

    Spoiler anzeigen


    $items = $itemManagement.GetItemsInFolder($testlaborGUID); Testlabor Software
    $name_testlabor=""
    $guid_testlabor=""

    For $NSItemDetails in $items
    $name_testlabor = $name_testlabor & "|" & $NSItemDetails.Name ; Produktnamen auslesen
    $guid_testlabor = $guid_testlabor & "|" &$NSItemDetails.guid ; Produktname Guid auslesen


    Next

    $name_testlabor=StringTrimLeft($name_testlabor,1) ; Erten String löschen ( blank)
    $guid_testlabor=StringTrimLeft($guid_testlabor,1); Erten String löschen ( blank)


    $name_testlabor=StringSplit($name_testlabor,"|",1)
    $guid_testlabor=StringSplit($guid_testlabor,"|",1)


    ;_ArrayDisplay($Herstellername)

    Dim $beides_testlabor[$name_testlabor[0]][2]
    For $i = 1 To $name_testlabor[0]
    $beides_testlabor[$i-1][0] = $name_testlabor[$i]
    $beides_testlabor[$i-1][1] = $guid_testlabor[$i]

    Next


    ;####################################################################### Policie

    $items_policie = $itemManagement.GetItemsInFolder($testlabor_policie_GUID); Testlabor Policie auslesen
    $name_policie_testlabor=""
    $guid_policie_testlabor=""

    For $NSItemDetails in $items_policie
    $name_policie_testlabor = $name_policie_testlabor & "|" & $NSItemDetails.Name ; Produktnamen auslesen
    $guid_policie_testlabor = $guid_policie_testlabor & "|" &$NSItemDetails.guid ; Produktname Guid auslesen


    Next

    $name_policie_testlabor=StringTrimLeft($name_policie_testlabor,1) ; Erten String löschen ( blank) links
    $guid_policie_testlabor=StringTrimLeft($guid_policie_testlabor,1); Erten String löschen ( blank)


    $name_policie_testlabor=StringSplit($name_policie_testlabor,"|",1)
    $guid_policie_testlabor=StringSplit($guid_policie_testlabor,"|",1)


    Dim $beides_policie_testlabor[$name_policie_testlabor[0]][2]
    For $i = 1 To $name_policie_testlabor[0]
    $beides_policie_testlabor[$i-1][0] = $name_policie_testlabor[$i]
    $beides_policie_testlabor[$i-1][1] = $guid_policie_testlabor[$i]

    Next


    ;##################################################################### ;Unterschiede Softwarelabor und Policie

    _ArrayDelete($name_testlabor,0)
    _ArrayDelete($name_policie_testlabor,0) ;


    For $i = UBound($name_testlabor) - 1 To 0 Step -1
    $2= _ArraySearch($name_policie_testlabor, $name_testlabor[$i])
    if $2<> -1 Then _ArrayDelete($name_testlabor, $i)


    Next


    ;_ArrayDisplay($name_testlabor, "$a1 nach Behandlung")


    For $i = 0 To UBound($name_testlabor) -1

    ;MsgBox(0,"",$name_testlabor[$i])
    $itemManagement.CreateFolder($name_testlabor[$i], $testlabor_policie_GUID )
    Next