Alle Werte von einem zweidimensonalen Array mit allen Werten eines eindimensionalen Arrays vergleichen

  • Hallo zusammen,

    Ich stelle das Script hier einfach mal rein.

    Ziel des Scriptes ist es, daß eine Fehlermeldung ausgegeben wird, wenn eine oder mehrere Personen im Array $MandatoryIniKeys vorhanden sind, aber NICHT in der INI Datei vorhanden sind.

    [autoit]


    #include <Array.au3>
    Const $MandatoryIniKeys = "Axel-Peter-Yvonne-Willi"
    $scriptIni = "AnwesendePersonen.ini"
    Dim $i, $a
    $Debug=1

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

    $SectionNames=IniReadSectionNames(@ScriptDir & "\" & $scriptIni) ;Lese die Anzahl und die einzelnen Sectionsnamen in ein array ein.
    $MandatoryIniArray = StringSplit ($MandatoryIniKeys, "-",1); Splitte die als Konstante angegebenen zwingenden Personen $MandatoryIniKeys in ein eindimensionales Array.
    If $Debug <> 0 Then _ArrayDisplay($MandatoryIniArray, "Liste der zwingend anwesenden Personen. ")

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

    For $i = 1 To $SectionNames[0]; Geht die INI Datei vom ersten bis zum letzten Sectionsnamen durch.
    If $SectionNames[$i]="PERSONEN" Then ; Wenn der Sectionsname [PERSONEN] lautet, überprüfe mit nachfolgender SuchFunktion ob alle Werte ($SectionNames) von PERSONEN in der Liste des $MandatoryIniArray's sind.
    $SectionValues=IniReadSection(@ScriptDir & "\" & $scriptIni, $SectionNames[$i]) ;Lese die Anzahl der einzelnen Schlüssel des Sectionsnamenms in ein zweidimensionales array ein.

    For $a = 1 To $SectionValues[0][0]
    If $Debug <> 0 Then _ArrayDisplay($SectionValues, "2D List for the " & $SectionNames[$i])
    Switch $SectionValues[$a][0]
    Case $MandatoryIniArray[1] To $MandatoryIniArray[0]
    If $Debug <> 0 Then MsgBox (0, "Gefunden", "Der Key " & $SectionValues[$a][0] & " der INI Datei mit dem Wert " & $SectionValues[$a][1] & " gefunden.")
    Case Else
    If $Debug <> 0 Then MsgBox (0, "Nicht Gefunden", "Der Key " & $SectionValues[$a][0] & " der INI Datei mit dem Wert " & $SectionValues[$a][1] & " NICHT gefunden.")
    EndSwitch
    Next

    EndIf
    Next

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

    Hier die Werte der INI Datei (oder die angehängte Datei download)
    [PERSONEN]
    Axel = Ganztägig
    Heinz = Ganztägig
    peter = Ganztägig
    Yvonne = Ganztägig
    Frank = Ganztägig
    Willi = Ganztägig

    [Themen]
    Axel = thema1
    Willi = thema1
    Frank = thema1
    Yvonne = thema1
    Peter = thema1
    Heinz = thema1

    Warum funktioniert das Script nicht? ?(
    Was habe ich falsch gemacht? ;(
    Hätte ich das Script anders aufbauen müssen :?:

    Vielen Dank im Voraus für Eure Mühe.

    Schönes Wochenende
    Axel

    --
    Mit freundlichen Grüßen,
    Axel Stoppa

    Einmal editiert, zuletzt von MCTAST245 (21. Juni 2009 um 02:47)

  • So?

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Global Const $MandatoryIniArray[4] = ["Axel","Peter","Yvonne","Willi"]
    Global $scriptIni = "AnwesendePersonen.ini"

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

    $aPersonen = IniReadSection(@ScriptDir & "\" & $scriptIni, 'Personen')

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

    For $i = 0 To UBound($MandatoryIniArray) -1
    _ArraySearch($aPersonen, $MandatoryIniArray[$i])
    If @error Then MsgBox(0,"", $MandatoryIniArray[$i] & ' ist nicht da!')
    Next

    [/autoit]
  • hi,
    also ich würde dir sofort die Funktion _ArraySearch vorschlagen (guck am besten in der Hilfedatei & vielleicht auch das Beispiel sowie die Rückgabe werte an)
    Damit kannst du dir sicherlich einige Zeilen Code sparen und es ziemlich einfach coden :D
    EDIT: es kann doch net sein oda? IMMER bin ich zu langsam wenn 2 zur gleichen Zeit antworten :P

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • Hallo zusammen,

    vielen Dank für Eure beiden Antworten.
    Selbstverständlich hab ich die diversen Befehle ausporbiert und mit der Autoit Hilfe gearbeitet, bevor ich hier gepostet habe. ;)
    Das sollte doch die erste Quelle sein.

    XovoxKingdom: Danke, _ArraySearch hatte ich ebenfalls in meinem ersten (nicht veröffentlichten Script) in Betracht gezogen.
    Hat bei mir nicht funktioniert. Deshalb habe ich die Case Switch Funktion probiert. :wacko:

    funkey: Durch dein Besipiel habe ich meinen Fehler in meinem ersten Script (nicht veröffentlichten Script) mit _ArraySearch erkannt. 8o

    _ArraySearch($aPersonen, $MandatoryIniArray[$i]) --> Als erstes Argument muss natürlich das komplette Array angegeben werden.
    Ich hatte es mit _ArraySearch($aPersonen[0][0], $MandatoryIniArray[$i]) probiert. ;(
    Ist ja eigentlich logisch, wenn man nicht gerade auf'm Schlauch steht.

    Eine Frage hat sich allerdings innerhalb deiner Antwort für mich ergeben.

    Wo besteht der Unterschied/Vorteil bei Verwendung von???
    For $i = 0 To UBound($MandatoryIniArray) -1
    zu der Schleife
    For $i = 0 To $MandatoryIniArray[0]

    Wenn ich das richtig verstehe, kann ich UBound bei Arrays verwendet, die die Größe nicht automatisch mit [0] zürückgeben, oder?

    Jedenfalls nochmals danke an Euch beiden, dass Ihr mir die Augen geöffnet habt.
    Jetzt klappt alles super! :thumbup:

    Viele Grüße,
    Axel aus'm Pott

    --
    Mit freundlichen Grüßen,
    Axel Stoppa

    • Offizieller Beitrag

    Wo besteht der Unterschied/Vorteil bei Verwendung von???
    For $i = 0 To UBound($MandatoryIniArray) -1
    zu der Schleife
    For $i = 0 To $MandatoryIniArray[0]


    Wenn eine Funktion ein Array zurückgibt mit Anzahl der Elemente an Index [0] kann man natürlich damit arbeiten. Ich bevorzuge aber auch die UBound-Abfrage. So brauch ich mir nie Gedanken machen, ob denn ein Zähler mitgeführt wird. Und beim Lesen von Quelltext ist es meiner Meinung nach auch übersichtlicher, da UBound sofort sagt: bis zum letzten Element.

  • Hallo Bugfix,

    Vielen Dank für die Erklärung.

    Ichdenke auch, dass ich demnächst die UBound Variante wähle, da Sie auch näher am VBS hängt. :D
    Dann können das die "transparenten" VBS Menschen ebenfalls besser nachvollziehen. :rofl:
    Ooooh. Die Bemerkung nehme ich zurück. Ich habe nur laut gedacht......

    Schnell weg.....

    Gruß,
    Axel aus'm Pott

    --
    Mit freundlichen Grüßen,
    Axel Stoppa