Array vergleichen

  • Hallo

    vielleicht kann mir jemand einen Tip geben:

    Ich habe 2 Arrays $arrayA[Wert][Wert2] und $arrayB[Wert][Wert2]


    Nun möchte ich im Prinzip Zeile für Zeile das ArrayB abarbeiten und schauen ob der Wert in ArrayA vorhanden ist.


    Die Inhalten vom Array sind: Dateiname, GeändertDatum


    Kann mir jemand kurz helfen ? Mit _ArraySearch hakts bei mir.


    Vielen Dank

  • Hi,

    [autoit]


    #include <array.au3>
    Dim $arrayA [1] [2] , $arrayB [1] [2]
    $arrayA [0] [0] = "Wert"
    $arrayA [0] [1] = "Wert2"
    $arrayB [0] [0] = "Wert"
    $arrayB [0] [1] = "Wert2"

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

    For $i = 0 To UBound ($arrayB) - 1
    If _ArraySearch ($arrayA, $arrayB [$i] [0], 0, 0, 0, 0, 0, 1) Then MsgBox (0,"","Gefunden")
    Next

    [/autoit]

    ;-))
    Stefan

  • Danke für deine Hilfe.

    ich bin jetzt mal auf 1D Arrays umgestiegen,habe da aber ein Problem.

    Ich poste hier mal den Code


    [autoit]

    #include <file.au3>
    #include <array.au3>
    #include <INet.au3>
    ;Zielordner
    $target = "C:\Word\"
    $file_comp = "C:\Word\Ergebnis\Vergleich.txt"
    $file_ein = "C:\Word\Ergebnis\Ergebnis.txt"
    ;Variablen für SMTP Server -> s. Hilfe _INetSMTPMail
    Global $s_SmtpServer = "mail.server.de"
    Global $s_ToAddress = "mail@server.de"
    Global $s_first = -1
    Global $s_helo = ""
    Global $s_FromName = "HROrder"
    Global $s_FromAddress = "HROrder@server.de"
    Global $s_subject = "ddr"
    Global $s_body = ""
    Global $s_body2 = ""
    Global $s_subject2 = "dd"
    Global $s_body3 = ""
    Global $s_subject3 = "dd"
    Global $aArray
    Global $bArray
    Global $uboundaArray
    Global $files
    _FileReadToArray($file_ein, $aArray)
    ; gesamten Dateiinhalt in einem 2D-Array ($aSplit) darstellen
    _ArrayDisplay($aArray,"1.Ergebnis")
    $Ergebnis_Vergleich = FileOpen($file_comp, 2)
    Do
    $files = _FileListToArray ($target, '*', 1)
    Sleep (20)
    Until $files <> 0
    ;Zeitstempel zu den Dateien hinzufügen und Array kreieren
    Global $filestime[Ubound ($files)][2]
    For $i = 1 to UBound ($files) - 1
    $filestime [$i][0] = $files[$i]
    $filestime [$i][1] = FileGetTime($target & $files[$i],0,1)
    $zeile = $filestime[$i][0] & "," & $filestime[$i][1]
    FileWriteLine($Ergebnis_Vergleich, $zeile & @CRLF)
    $zeile =""
    Next
    FileClose($Ergebnis_Vergleich)
    _FileReadToArray($file_Comp, $bArray)
    _ArrayDisplay($bArray,"Vergleichen")
    $uboundaArray = Ubound($aArray)

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

    ;wenn neue Datei gelöscht oder geändert
    For $i = 1 To $uboundaArray -1
    ;Wenn Datei nicht im Initialarray
    if _ArraySearch ($bArray, $aArray[$i]) = -1 Then
    $s_subject = "Gelöschtst oder geändertes File: " & $aArray[$i]
    ;Verschicke Mail
    _INetSmtpMail ($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject, $s_body, $s_helo, $s_first)
    EndIf
    Next

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

    ;wenn neue Datei hinzugekommen oder geändert
    For $i = 1 To UBound ($bArray) - 1
    ;Wenn Datei nicht im Initialarray
    if _ArraySearch ($aArray, $bArray[$i]) = -1 Then
    $s_subject = "Neues oder geändertes File: " & $bArray[$i]
    ;Verschicke Mail
    _INetSmtpMail ($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject, $s_body, $s_helo, $s_first)
    EndIf
    Next

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


    Ich habe eine Datei 1 (1.Ergebnis) mit folgendem Inhalt

    Test.doc,20100225125439
    Test8.doc,20100225125438
    Test7.doc,20100225125438
    Test6.doc,20100225125438
    Test5.doc,20100225125438
    Test4.doc,20100225125438
    Test3.doc,20100225125438
    Test2.doc,20100225125438
    Test1.doc,20100225125438
    Test20.doc,20100225125438
    Test30.doc,20100225125438
    Test40.doc,20100225125438


    dann habe ich eine 2 Datei (Vergleich.txt) mit folgendem Inhalt

    Test - Kopie.doc,20100225125439
    Test.doc,20100225125439


    Nun soll das Prog die Unterschiede rausfinden, dazu habe ich beide Files in ein Array gelesen.

    Das neue File in der Vergleich.txt erkennt er mir auch, ich bekomme eine Mail.

    Aber die Files die in der 1. Datei stehen (Ergebnis.txt oder $aArray) werden nicht erkannt, eigentlich sollte er das tun, da diese Werte nicht im 2ten Array ($bArray) vorhanden sind.


    Warum bekomme ich da keine Mails ? Checke das nicht.


    Danke für Eure nette Unterstützung.


    P.S. Ich weiß in dem Script sind zuviele Variablen etc. drin, das kommt vom Testen und wird noch aufgeräumt :)

  • Guten Morgen,


    den Code den ich gepostet habe funktioniert. Die mails sind nur im Spamfilter hängen geblieben.


    Allerdings tut das noch nciht so ganz wie ich das gerne hätte:


    Wenn nun ein File geändert wurde, dann bekomme ich die Mail 2 x, da sie in beiden Schleifen gefunden wird.

    Wie kann ich das denn abstellen ? D.h. ich müsste das 1 D Array auf 2D Array aufbohren, das ist kein Problem.

    Wie aber durchsuche ich das dann ?


    [autoit]

    ;File wieder einlesen und wie $aSplit in ein Array einlesen
    _FileReadToArray($file_comp, $bArray)
    ; gesamten Dateiinhalt in einem 2D-Array ($aSplit) darstellen
    For $i = 1 To UBound($bArray) -1
    $tmpSplit2 = StringSplit($bArray[$i], ',', 2)
    If @error Then ContinueLoop ; falls Leerzeile
    For $j = 0 To 1
    $aSplit2[$i-1][$j] = $tmpSplit2[$j]
    Next
    Next

    [/autoit]
  • hab mal versucht was ich auf die Reihe bekomme, aber ...


    [autoit]

    ;wenn neue Datei hinzugekommen
    ;Schleife über Array
    For $i = 1 To UBound ($asplit2) - 1
    ;Wenn Datei nicht im Initialarray
    If _ArraySearch ($aSplit, $asplit2[$i][0]) = -1 Then
    ReDim $aSplit [Ubound ($aSplit) + 1]
    $aSplit[Ubound ($aSplit) - 1] = $asplit2[$i][0]
    $s_subject = "Neues File: " & $asplit2[$i][0]
    ;Verschicke Mail
    _INetSmtpMail ($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject, $s_body, $s_helo, $s_first)
    EndIf
    Next

    [/autoit]


    Dieser Code sollte eigentlich sagen wenn ich in dem 2D Array B (Filename, Uhrzeit) den Wert auch in Array A finde, dann keine Mail, da File gleich.

    Wenn ich in Array B einen Satz habe der nicht im Array A ist, dann bitte Mail.


    Für gelöschte Files wäre das dann nur umgekehrt, und für abgeänderte ? Keine Ahnung.

    Leider funzt ja nicht mal das mit den Neuen Dateien.


    Jemand einen Tip ?

  • Hallo

    ich weiß mein Beitrag wird ellenlang.

    Bitte ignoriert die oben genannten Beiträge


    Mittlerweile klappt es bei neuen Files, gelöschten Files.


    Vielleicht kann mir nur jemand helfen wie ich geänderte Files mit einander vergleiche ?

    Hier müsste ich ja zwei 2D Arrays vergleichen und zwar Spalte 1 Wert ok, Spalte 2 Zeitstempel unterschiedlich.


    Wie bekomme ich das hin ? Muss wohl eine verschachtelte for Schleife sein


    Hier mal mein Code bis dato:


    [autoit]

    #include <file.au3>
    #include <array.au3>
    #include <INet.au3>
    ;Zielordner
    $target = "C:\Word\"
    $file_comp = "C:\Word\Ergebnis\Vergleich.txt"
    $file_ein = "C:\Word\Ergebnis\Ergebnis.txt"
    ;Variablen für SMTP Server -> s. Hilfe _INetSMTPMail
    Global $s_SmtpServer = "server.de"
    Global $s_ToAddress = "to@mail.de"
    Global $s_first = -1
    Global $s_helo = ""
    Global $s_FromName = "HROrder"
    Global $s_FromAddress = "mail@mail.de"
    Global $s_subject = "dd"
    Global $s_body = ""
    Global $s_body2 = ""
    Global $s_subject2 = "dd"
    Global $s_body3 = ""
    Global $s_subject3 = "dd"
    Global $aArray
    Global $bArray
    Global $tmpSplit
    $Zeilen_Ergebnis = _FilecountLines($file_ein)
    Global $aSplit[_FilecountLines($file_ein)][2]
    Global $tmpSplit2
    ;Global $aSplit2[_FileCountLines($file_comp)][2]
    Global $files
    _FileReadToArray($file_ein, $aArray)
    ; gesamten Dateiinhalt in einem 2D-Array ($aSplit) darstellen
    For $i = 1 To UBound($aArray) -1
    $tmpSplit = StringSplit($aArray[$i], ',', 2)
    If @error Then ContinueLoop ; falls Leerzeile
    For $j = 0 To 1
    $aSplit[$i-1][$j] = $tmpSplit[$j]
    Next
    Next
    ;_ArrayDisplay($aSplit,"1.Ergebnis")
    ;Ordnerinhalt erneut einlesen (3,5 Std. später) und vergleichen mit Array $aSplit
    $Ergebnis_Vergleich = FileOpen($file_comp, 2)
    Do
    $files = _FileListToArray ($target, '*', 1)
    Sleep (20)
    Until $files <> 0
    ;Zeitstempel zu den Dateien hinzufügen und Array kreieren
    Global $filestime[Ubound ($files)][2]
    For $i = 1 to UBound ($files) - 1
    $filestime [$i][0] = $files[$i]
    $filestime [$i][1] = FileGetTime($target & $files[$i],0,1)
    $zeile = $filestime[$i][0] & "," & $filestime[$i][1]
    FileWriteLine($Ergebnis_Vergleich, $zeile & @CRLF)
    $zeile =""
    Next
    FileClose($Ergebnis_Vergleich)
    Global $aSplit2[_FileCountLines($file_comp)][2]
    ;File wieder einlesen und wie $aSplit in ein Array einlesen
    _FileReadToArray($file_comp, $bArray)
    ; gesamten Dateiinhalt in einem 2D-Array ($aSplit) darstellen
    For $i = 1 To UBound($bArray) -1
    $tmpSplit2 = StringSplit($bArray[$i], ',', 2)
    If @error Then ContinueLoop ; falls Leerzeile
    For $j = 0 To 1
    $aSplit2[$i-1][$j] = $tmpSplit2[$j]
    Next
    Next
    ;_ArrayDisplay($aSplit2,"Vergleich")
    ;msgbox(64,"Title","Wert von asplit2: " & Ubound($aSplit2) - 1)
    ;wenn neue Datei hinzugekommen
    ;Schleife über Array
    For $i = 1 To UBound ($asplit2) - 1
    ;msgbox(64,"Title","Wert von asplit2: " & $aSplit2[$i][0])
    ;msgbox(64,"Title","Wert von asplit: " & $aSplit)
    ;Wenn Datei nicht im Initialarray
    If _ArraySearch ($aSplit, $asplit2[$i][0]) = -1 Then
    $s_subject = "NEW File: " & $asplit2[$i][0]
    ;Verschicke Mail
    _INetSmtpMail ($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject, $s_body, $s_helo, $s_first)
    EndIf
    Next
    ;wenn alte Datei gelöscht wurde
    For $i = 1 To UBound ($aSplit) - 1
    ;Wenn Datei gelöscht
    If _ArraySearch ($aSplit2, $aSplit[$i][0]) = -1 Then
    $s_subject = "DELETED FILE: " & $aSplit[$i][0]
    ;Verschicke Mail
    _INetSmtpMail ($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject, $s_body, $s_helo, $s_first)
    EndIf
    Next
    ;wenn bestehende Datei verändert wurde
    ; For $i = 1 To UBound ($aSplit2) - 1
    ;$index = _Arraysearch ($aSplit, $aSplit2[$i][0])
    ;If $index Then
    ; If $aSplit[$index][1] <> $aSplit2[$i][1] Then
    ; $s_body3 = "CHANGED FILE: " & $aSplit2[$i]
    ;_INetSmtpMail ($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject3, $s_body3, $s_helo, $s_first)
    ; EndIf
    ; EndIf
    ; Next

    [/autoit]
  • Ich habe es eigentlich geschafft

    Das Vergleichen mit abgeänderten Datum klappt

    Nur bringt er mir beim Abarbeiten der Schleife den Fehler:

    Zeiel: 5: Array variable subscript badly formatted.


    Funzen tut es aber, warum kommt der Fehler ?


    [autoit]

    ;wenn bestehende Datei verändert wurde
    For $i = 1 To UBound ($aSplit2) - 1
    $index = _Arraysearch ($aSplit, $aSplit2[$i][0])
    If $index Then
    If $aSplit[$index][1] <> $aSplit2[$i][1] Then
    MsgBox(16,"Title","Inhalt von asplit/2: " & $aSplit[$index][1] & " " & $aSplit2[$i][1])
    $s_subject = "CHANGED FILE: " & $aSplit2[$i][0]
    _INetSmtpMail ($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject, $s_body, $s_helo, $s_first)
    EndIf
    EndIf
    Next

    [/autoit]


    Vielleicht liest das jemand noch !

  • wenn ich mich nicht irre ist das wenn man ein array mit z.B. $array[-1] oder so abfragen will

    das könnte bei dir auch der fall sein, weil _Arraysearch() -1 zurückgeben kann (falls ein fehler stattfindet)

    wenn ich richtig liege dann wäre das ganze mit einer if abfrage leicht gelöst ;)

  • Hallo Schnitzel,


    ja das funktioniert. Habe einfach bei der If Abfrage ein <> -1 eingefügt.


    Das klappt, aber was mir auffällt ist:

    Ist es möglich das _ArraySearch nur gewisse Zeichenlänge vergleicht ?


    z.B. Ich habe einen Wert im Array wie folgt:

    "Layout specification for case for order W-1266901"


    Nun gibt es in dem anderen Array auch einen Wert wie folgt:

    "Layout specification for case for order W-1266901 2", also nur ein 2 mehr.


    Normalerweise arbeitet die Abfrage korrekt, aber den Unterschied zwischen den beiden oben genannten Werten kriegt er nicht mit.


    Ist das ein Bug ?


    Vielen Dank