Ganze Zeile in Array durchsuchen

  • Hallo. Kann ich in einer einzelnen Zeile in einem Array mit mehreren Spalten unkompliziert was suchen? Man kann mit _arraysearch() zwar auch Spalten durchsuchen, man muss damit aber immer umständlicherweise die Spalte angeben die durchsucht werden soll.

    Geht das einfacher?

  • Wenn ich dich richtig verstanden habe, willst du in einer Zeile nach einen bestimmten Wert suchen?

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Global $aiArray[5][5], $iA, $iB
    Global $sSearch = @CRLF & ' | Spalten:' & @CRLF & '-------------------------' & @CRLF

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    ; Mit zufälligen Werten füllen:
    For $iA = 0 To UBound($aiArray) - 1
    For $iB = 0 To UBound($aiArray, 2) - 1
    $aiArray[$iA][$iB] = Random(1, 5, 1)
    Next
    Next

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    ; Wert finden: 5
    For $iA = 0 To UBound($aiArray) - 1
    $sSearch &= 'Zeile ' & $iA & ' | '
    For $iB = 0 To UBound($aiArray, 2) - 1
    If $aiArray[$iA][$iB] = 5 Then $sSearch &= $iB & ', '
    Next
    $sSearch &= @CRLF
    Next

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

    $sSearch &= @CRLF

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    ; Gesuchte Spalten ausgeben:
    ConsoleWrite($sSearch)
    _ArrayDisplay($aiArray)

    [/autoit]
  • Wenn ich dich richtig verstanden habe, willst du in einer Zeile nach einen bestimmten Wert suchen?


    Korrekt. Allerdings verstehe ich nicht ganz was du mit deinem Code sagen/zeigen möchtest :)

    Eine Variante mit Schleifen etc. habe ich ja auch bereits gefunden. Aber das ist mir halt zu kompliziert, geht das nicht einfacher?

  • Wenn du einen Wert in einer Zeile suchen willst und nur die Spalten durchgehen willst, kommst du an der Schleife nicht drum herum.
    Zudem: Was ist an einer Schleife so kompliziert?

    Und woher sollte ich wissen dass du bereits eine Schleifen Lösung gefunden hast? :P

  • Eine Variante mit Schleifen etc. habe ich ja auch bereits gefunden. Aber das ist mir halt zu kompliziert, geht das nicht einfacher?

    Ich will Autofahren aber das mit diesem Lenkrad und den Pedalen ist mir halt zu kompliziert, geht das nicht einfacher?
    So ungefähr hört sich das an... ;)
    Vielleicht solltest du dich erst einmal mit ein zwei Grundlagen Tutorials auseinandersetzen bevor du richtig loslegst. :)

    LG
    Christoph :)

  • Zitat von Christoph54

    Ich will Autofahren aber das mit diesem Lenkrad und den Pedalen ist mir halt zu kompliziert, geht das nicht einfacher?

    :D

    Er hat Recht

    Um Missverständnisse zu vermeiden, mein Name rührt vom Sternenbild und nicht vom Shop her :D


    Rainbow Dash :rock:

    "Das, wobei unsere Berechnungen versagen, nennen wir Zufall." (Albert Einstein)

  • Ich will Autofahren aber das mit diesem Lenkrad und den Pedalen ist mir halt zu kompliziert, geht das nicht einfacher?
    So ungefähr hört sich das an... ;)
    Vielleicht solltest du dich erst einmal mit ein zwei Grundlagen Tutorials auseinandersetzen bevor du richtig loslegst. :)


    Ich bin mit den Grundlagen durchaus vertraut ;) Schleifen an sich sind nichts schlimmes, habe einfach gehofft dass ich das mit einer Funktion lösen kann ;)

    • Offizieller Beitrag

    Wenn du nix selbst machen willst, dann benutze _Array2DSearch von BugFix, da kannst du nach einem Suchbegriff innerhalb der Arrays suchen, egal in welche Dimension (Spalte) er steht.
    ArrayMore.au3

  • *_* - Sag das doch gleich...
    Dann schreib dir doch ne Funktion?

    Ist nicht so schwer...

    Jap, habe ich auch schon dran gedacht. Hatte vorhin nur irgendwie einen Knoten im Hirn, mache morgen bei der Arbeit weiter :)

    Wenn du nix selbst machen willst, dann benutze _Array2DSearch von BugFix, da kannst du nach einem Suchbegriff innerhalb der Arrays suchen, egal in welche Dimension (Spalte) er steht.
    ArrayMore.au3

    Naja, dass ich nichts selber gemacht habe stimmt nicht ganz. Habe da vorhin eine ganze Weile dran gesessen und mir den Kopf zermatert bevor ich hier nach Hilfe gefragt habe ;)

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    #Include <File.au3>
    #Include <Date.au3>

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

    dim $druckeruebersicht[2][2]
    Local $var
    yfnrpc()
    ;~ dim $yfnrpc[1] = ["yf7sltpy"]

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

    _arraydisplay($yfnrpc)

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

    for $i = 0 to UBound($yfnrpc) - 1
    $einzulesende_csv = @ScriptDir & "\" & $yfnrpc[$i] & ".csv"
    if FileExists($einzulesende_csv) = 1 Then ;Hier ist das Problem begraben. Ich habe bisher nur eine Testdatei in dem Verzeichnis. Bei jedem Durchgang wird wieder diese Testdatei herangezogen, weil FileExists() jede Datei aus dem Array angeblich findet...


    Global $aCSV
    global $trennzeichen = ","
    Dim $array_komplett[1][1]

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

    _filereadtoarray($einzulesende_csv, $aCSV)

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

    for $i = 3 to ubound($aCSV) - 1
    Dim $aNeuesArray[1]
    Local $spalte = $aCSV[$i]
    while 1
    $erstestrennzeichen = StringInStr($spalte, $trennzeichen) ;Sucht nach der Stelle des nächsten Trennzeichens
    if $erstestrennzeichen Then ;Wenn eins gefunden wurde, dann...
    $aNeuesArray[ubound($aNeuesArray) - 1] = StringLeft($spalte, $erstestrennzeichen - 1) ;wird ein neuer String in das temporäre Array geschrieben. Der String beinhaltet den Inhalt des Strings von dem "großen Array" von der ersten Position bis zu der Position wo das erste Trennzeichen gefunden, minus damit das Trennzeichen selber in das neue Array nicht mit geschrieben wird.
    redim $aNeuesArray[ubound($aNeuesArray) + 1] ;Für den nächsten Inhalt wird eine weitere Zeile dem Array hinzugefügt
    $spalte = StringTrimLeft($spalte, $erstestrennzeichen) ;Für den nöchsten Durchlauf wird der String bis zum ersten Trennzeichen gekürzt
    Else
    _arraydelete($aNeuesArray, ubound($aNeuesArray)) ;Löscht die letzte Zeile des Arrays, die in jedem Durchgang zu viel geschrieben wird
    if ubound($aNeuesArray) > ubound($array_komplett, 2) Then ;Die Anzahl der Spalten in $array_komplett ist abhängig von der Anzahl der Zeilen in $aNeuesArray.
    redim $array_komplett[ubound($array_komplett) + 1][ubound($aNeuesArray)] ;Wenn in $aNeuesArray mehr Zeilen als Spalten in $array_komplett vorhanden sind, so wird die Anzahl der Spalten angepasst.
    Else
    redim $array_komplett[ubound($array_komplett) + 1][ubound($array_komplett, 2)] ;Ansonsten bleibt die Spaltenanzahl gleich, und es wird nur eine neue Zeile angehängt.
    EndIf

    for $a = 0 to ubound($aNeuesArray) - 1 ;Hier werden die Inhalte aus den Zeilen von $aNeuesArray in die Spalten von $array_komplett aufgeteilt
    $array_komplett[ubound($array_komplett) - 1][$a] = $aNeuesArray[$a]
    Next
    ExitLoop
    EndIf
    WEnd
    Next

    ;Col 1 = User
    ;Col 4 = Drucker
    for $b = 1 to ubound($array_komplett) - 1

    ;~ $druckeruebersicht[ubound($druckeruebersicht) - 1][0] = $yfnrpc[$i]
    ;~ $druckeruebersicht[ubound($druckeruebersicht) - 1][1] = $array_komplett[$b][1]


    ;~ for $e = 0 to ubound($druckeruebersicht, 2) - 1
    ;~ MsgBox(1, "lala", "Schleife 2")
    ;~ if stringinstr($druckeruebersicht[ubound($druckeruebersicht) - 1][$e], $array_komplett[$b][4]) Then
    ;~ $var = 1
    ;~ EndIf
    ;~ Next
    ;~ if $var < 1 Then
    ;~
    ;~ ReDim $druckeruebersicht[ubound($druckeruebersicht)][ubound($druckeruebersicht, 2) + 1]
    ;~ $druckeruebersicht[ubound($druckeruebersicht) - 1][ubound($druckeruebersicht, 2) - 1] = $array_komplett[$b][4]
    ;~ EndIf
    ;~
    ;~


    ;~ if $array_komplett[$b][4] <> $druckeruebersicht[ubound($druckeruebersicht) - 1][$e] Then
    ;~ MsgBox(1, "lala", $array_komplett[$b][4])
    ;~ MsgBox(1, "lala", $druckeruebersicht[ubound($druckeruebersicht) - 1][$e])

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

    ;~ EndIf
    ;~ _arraydisplay($druckeruebersicht)

    Next

    EndIf
    Next

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

    func yfnrpc() ; erstellt ein array "yfnrpc[]" mit allen yf-nr der rechner
    ; es wird auf dem tja nach missing_patches_neu* logdateien gesucht. logdatei = pc = yfnr
    Global $yfnrpc[1]
    Local $search = FileFindFirstFile("\\yf7sltja\log$\missing_patches_neu*") ; suche nach DER ERSTEN missing_patches_neu* datei
    Local $count = 0
    If $search = -1 Then ; errorhandling
    MsgBox(0, "Error", "No files/directories matched the search pattern")
    Exit
    EndIf
    While 1
    local $file = FileFindNextFile($search) ; suche die NÄCHSTE missing_patches_neu* datei
    If @error Then ExitLoop
    local $yfnr = StringRight ( $file, 8 ) ; lese vom dateinamen nur die letzten 8 zeichen
    _ArrayAdd($yfnrpc, $yfnr)
    $count = $count + 1
    WEnd
    FileClose($search)
    _ArraySwap($yfnrpc[0], $count)
    EndFunc

    [/autoit]

    Es ist so, dass ich einige csv's habe, in denen Infos über das Druckverhalten von Benutzern ist, also Dateiname, Name des PC's, Name des Druckobjektes etc.

    Habe nun diese Datei in einem Array formatiert, damit ich das Ganze weiterverarbeiten kann. Mein Ziel ist es nun, dass ich herausfinde und gebündelt darstellen kann, welcher User auf welchen Drucker bzw. welches Druckobjekt druckt.

    Nun wollte ich aus dem Array $array_komplett die Druckobjekte, Name des Users und Arbeitsstation extrahieren und in ein neues Array schreiben. Dabei wollte ich dass in dem neuen Array in der ersten Spalte die Arbeitsstaion, in der zweiten der Username und in den darauffolgenden Spalten die Drucker aufgelistet werden. Und dafür brauche ich das weshalb ich überhaupt schreibe.

    Da die verschiedenen Dokumente auf die gleichen Druckobjekte gedruckt werden, tauchen diese natürlich häufiger auf, ich will sie aber bloß jeweils nur einmal in meinem neuen Array gelistet haben.

  • So, heute bin ich recht schnell zu einer Lösung gekommen. Hier mal nur der Auszug aus dem Skript, den ich soweit geändert habe:

    Spoiler anzeigen
    [autoit]

    for $f = 1 to ubound($array_komplett) - 1 ;In dieser Schleife wird das Druckobjekt verarbeitet, welchen in dem $array_komplett steht.
    $var = 10 ;Diese Variable gibt später einen Wert von einer Schleife zur anderen weiter -> Deklariert wurde sie am Anfang des Skriptes. Dies hier dient nur zum "resetten" der Variable, wenn der Wert verändert wurden wäre

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

    $druckeruebersicht[ubound($druckeruebersicht) - 1][0] = $yfnrpc[$c] ;Weist immer der ersten Spalte im Array die yf-id des PC's zu
    $druckeruebersicht[ubound($druckeruebersicht) - 1][1] = $array_komplett[$f][1] ;Weist immer der zweiten Spalte im Array die yf-id des Users zu

    for $e = 0 to ubound($druckeruebersicht, 2) - 1 ;Diese Schleif gleicht ab, ob das zu verarbeitende Druckobjekt aus $array_komplett in dem Array $druckeruebersicht bereits vorhanden ist
    if $druckeruebersicht[ubound($druckeruebersicht) - 1][$e] = $array_komplett[$f][4] Then ;Wenn dies der Fall ist dann...
    $var = 100 ;... wird der Wert der Variablen geändert...
    EndIf
    Next

    if $var = 10 Then ;... was bedeutet dass dieses Druckobjekt nur weiterverarbeitet wird wenn der Variablenwert dem Ursprungswert entspricht was wiederum ein Indiz dafür wäre, dass das Druckobjekt aus $array_komplett noch nicht in $druckeruebersicht vorhanden ist
    for $k = 0 to ubound($druckeruebersicht, 2) - 1 ;Ist das Druckobjekt noch nicht vorhanden, so wird mit dieser Schleife geprüft, wo in dem Array (in der aktuellen Zeile) in welcher Spalte noch Platz zum schreiben des neuen Druckobjektes ist.
    if $druckeruebersicht[ubound($druckeruebersicht) - 1][$k] = "" Then ;Hierfür muss der Wert der Zelle leer sein ( "" )
    $druckeruebersicht[ubound($druckeruebersicht) - 1][$k] = $array_komplett[$f][4] ;Wurde eine leere Zelle gefunden, wird das aktuelle Druckobjekt aus $array_komplett in die ensprechende Zelle in $druckeruebersicht geschrieben
    ExitLoop ;und die Schleife verlassen, da sonst im nächsten Schleifendurchlauf der Wert erneut noch in die nächste freie Zelle geschrieben würde
    EndIf
    Next
    EndIf

    Next

    [/autoit]

    Eigentlich ganz einfach :) Danke für eure Bemühungen ;)

    • Offizieller Beitrag

    Na dann kannst du den Thread ja auch auf gelöst setzen ;)