Array filtern

  • Hallo miteinander,

    ich beschreite gerade meine ersten Gehversuche mit Array's. Leider komme ich gerade nicht weiter. Ich möchte aus dem Array gerne alle Einträge löschen die nicht folgendem Format entsprechen: "*, *", Das heißt es sollte ein Array zurückgegeben werden der nur Zeilen mit den Nachnamen, Vornamen enthält. Wenn ich in der $string den Namen eintippe kommt ein! richtiges Resultat aber nicht alle.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Dim $aArray[5]

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

    $aArray[0]='chef'
    $aArray[1]='Nachname, Vorname'
    $aArray[2]=0098300
    $aArray[3]='test'
    $aArray[4]='Mueller, Manfred'
    $aArray[4]='23000'

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

    $string = '*, *';mit 'Nachname, Vorname' bekomme ich zwar einen Datenstz zurück - es sollten aber hier zwei sein
    For $i = 0 To UBound($aArray) - 1
    If $aArray[$i] = $string Then ConsoleWrite($i&'='&$aArray[$i]&@CRLF)
    NEXT

    [/autoit]

    MfG Jescho

    Jeder hat mal klein angefangen - aber nicht jeder kommt groß raus!

    3 Mal editiert, zuletzt von Jescho (26. Mai 2010 um 01:22)

  • $aArray[4]='Mueller, Manfred'
    $aArray[4]='23000'

    Meinst du Vielleicht:

    [autoit]


    $aArray[4]='Mueller, Manfred'
    $aArray[5]='23000'

    [/autoit]
  • [4]/[5] - das war nur ein Tippfehler. Natürlich muß die Zahl fortlaufend sein :rock:

    MfG Jescho

    Jeder hat mal klein angefangen - aber nicht jeder kommt groß raus!

    • Offizieller Beitrag

    Dazu brauchst Du schon StringRegExp:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>

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

    Dim $aArray[6]

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

    $aArray[0] = 'chef'
    $aArray[1] = 'Nachname, Vorname'
    $aArray[2] = 0098300
    $aArray[3] = 'test'
    $aArray[4] = 'Mueller, Manfred'
    $aArray[5] = '23000'

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

    For $i = 0 To UBound($aArray) - 1
    If StringRegExp($aArray[$i], '.+,.+') Then ConsoleWrite($i & '=' & $aArray[$i] & @CRLF)
    Next

    [/autoit]
  • danke das war's :rock: jetzt versuche ich erst mal wieder selber weiter zu kommen.

    MfG Jescho

    Jeder hat mal klein angefangen - aber nicht jeder kommt groß raus!

  • ja ich lese erstmal und meistens kann ich damit meine Fragen schon beantworten. Bis jetzt sind sie noch nicht so tiefgreifend. Ich bin auch programmiertechnisch eher die Kategorie Anfänger, habe mich aber voll vom Fieber packen lassen. Schuld ist natürlich dieses Forum :thumbup:

    MfG Jescho

    Jeder hat mal klein angefangen - aber nicht jeder kommt groß raus!

  • also das mit den Arrays ist wirklich nicht einfach! Jetzt habe ich den Tipp umgesetzt und die Liste ist auch schon super.

    Leider musste ich feststellen, dass bei der Filterung zwei falsche Einträge auch dieses Format haben. Jetzt möchte ich diese Fehler auch noch aus filtern.

    Als Lösungsansatz habe ich einen zweiten Array mit den Fehlereinträgen erstellt und wollte es gegeneinander checken lassen. Ich habe auch schon versucht es über ein Zwischen-Array zu lösen, aber leider ohne gewünschten Erfolg. Schlimmer noch jetzt sind alle Einträge doppelt da. Wo ist mein Denkfehler bzw. Unwissenheit. Anbei mein Code:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Dim $aArray[8]

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

    $aArray[0] = 'chef'
    $aArray[1] = 'Nachname, Vorname'
    $aArray[2] = 0098300
    $aArray[3] = 'test'
    $aArray[4] = 'Mueller, Manfred'
    $aArray[5] = '23000'
    $aArray[6] = 'Abteilung Finanz, Personal'
    $aArray[7] = 'Abteilung Produktion, Kontrolle'

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

    Dim $aFehler[2]

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

    $aFehler[0] = 'Abteilung Finanz, Personal'
    $aFehler[1] = 'Abteilung Produktion, Kontrolle'

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

    For $i = 0 To UBound($aArray) - 1
    For $j = 0 To UBound($aFehler) - 1
    If StringRegExp($aArray[$i], ',') <> $aFehler[$j] Then ConsoleWrite($i & '=' & $aArray[$i] & @CRLF)
    Next
    Next

    [/autoit]

    MfG Jescho

    Jeder hat mal klein angefangen - aber nicht jeder kommt groß raus!

  • meinst du in etwa so?

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Dim $aArray[8]

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

    $aArray[0] = 'chef'
    $aArray[1] = 'Nachname, Vorname'
    $aArray[2] = 0098300
    $aArray[3] = 'test'
    $aArray[4] = 'Mueller, Manfred'
    $aArray[5] = '23000'
    $aArray[6] = 'Abteilung Finanz, Personal'
    $aArray[7] = 'Abteilung Produktion, Kontrolle'

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

    Dim $aFehler[2]

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

    $aFehler[0] = 'Abteilung Finanz, Personal'
    $aFehler[1] = 'Abteilung Produktion, Kontrolle'

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

    $i = 0
    Do
    $bWarFehler = False

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

    For $j = 0 To UBound($aFehler) - 1
    If $aArray[$i] = $aFehler[$j] Then
    _ArrayDelete($aArray, $i)
    $bWarFehler = True
    ExitLoop
    EndIf
    Next

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

    If Not $bWarFehler Then $i += 1
    Until $i = UBound($aArray)

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

    _ArrayDisplay($aArray)

    [/autoit]
    • Offizieller Beitrag

    Oder so:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>

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

    Dim $aArray[8]

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

    $aArray[0] = 'chef'
    $aArray[1] = 'Nachname, Vorname'
    $aArray[2] = 0098300
    $aArray[3] = 'test'
    $aArray[4] = 'Mueller, Manfred'
    $aArray[5] = '23000'
    $aArray[6] = 'Abteilung Finanz, Personal'
    $aArray[7] = 'Abteilung Produktion, Kontrolle'

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

    For $i = 0 To UBound($aArray) - 1
    If StringRegExpReplace($aArray[$i], '\H+, \H+', '') = '' Then ConsoleWrite($aArray[$i] & @CR)
    Next

    [/autoit]
  • Oscar
    danke ich habe die Variante gleich auf mein Projekt umgesetzt. Leider muss ich sagen, das zwar die entsprechenden Einträge ausgefiltert werden, jedoch erscheinen jetzt im Array leere Einträge. Ich würde ja gerne die Func StringRegExpReplace anpassen, leider muss ich sagen, ich verstehe sie bis jetzt noch nicht. Ich werde mir noch mal die Hilfe verinnerlichen.

    MfG Jescho

    Jeder hat mal klein angefangen - aber nicht jeder kommt groß raus!

  • so?

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Dim $aArray[8]

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

    $aArray[0] = 'chef'
    $aArray[1] = 'Nachname, Vorname'
    $aArray[2] = 0098300
    $aArray[3] = 'test'
    $aArray[4] = 'Mueller, Manfred'
    $aArray[5] = '23000'
    $aArray[6] = 'Abteilung Finanz, Personal'
    $aArray[7] = 'Abteilung Produktion, Kontrolle'

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

    $i = 0
    Do
    If StringRegExpReplace($aArray[$i], '\H+, \H+', '') <> '' Then
    _ArrayDelete($aArray, $i)
    Else
    $i += 1
    EndIf
    Until $i = UBound($aArray)

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

    _ArrayDisplay($aArray)

    [/autoit]
  • @AMrK
    nein es Gibt das gleiche Bild wie Oscar seine Funktion.
    Da es aber bei dem Demo-Array was ich ins Forum gestellt habe funktioniert, frage ich mich ob es eventuell an meinen Daten liegt. Ich erstelle ein Array aus einer Exceltabelle wo ich den Filter drüber laufen lasse. Ich denke mal es lieget daran, dass da auch Leerzeilen in der Tabelle enthalten sind?

    Wie kann ich den StringRegExpReplace entsprechend anpassen. Bitte nicht nur den Code, für eine Erklärung zum nachvollziehen wäre ich sehr dankbar.

    MfG Jescho

    Jeder hat mal klein angefangen - aber nicht jeder kommt groß raus!

  • Hallo,
    zum Thema Regexp und Anfänger:
    Ja, man sollte die Mächtigkeit von Regexp erwähnen, aber gerade ein Anfänger hat m.E. schon genug andere Probleme :), da sollte man ihn nicht noch damit "erschlagen". Einfachste Stringbefehle erfüllen meistens die Aufgabe genauso, und haben den Vorteil, auch später noch "lesbar" und auch nachvollziehbar zu sein.

    Zitat

    Bitte nicht nur den Code, für eine Erklärung zum nachvollziehen wäre ich sehr dankbar.

    wzbw, ein Tutorial zum Thema gibts hier https://autoit.de/index.php?page…9356#post149356

    @topic

    Zitat

    Ich erstelle ein Array aus einer Exceltabelle

    das einfachste wäre, direkt hier anzusetzen. Und zwar nicht die gesamte Tabelle einzulesen, sondern nur die Spalte mit "Name, Vorname". Denn ich wäre sehr gespannt auf den Regex, der folgende Namen richtig filtert:[spoiler]

    [autoit]

    $aArray[0] = 'chef'
    $aArray[1] = 'Nachname, Vorname'
    $aArray[2] = 0098300
    $aArray[3] = 'test'
    $aArray[4] = 'Mueller, Manfred'
    $aArray[5] = '23000'
    $aArray[6] = 'Abteilung Finanz, Personal'
    $aArray[7] = 'Abteilung Produktion, Kontrolle'
    $aArray[8] = ''
    $aArray[9] = 'Meyer, Klaus Dieter'
    $aArray[10] = 'Müller-Lüdenscheid,Klaus Dieter' ;kein leerzeichen nach dem Komma
    $aArray[11] = 'Dr. Klöbner, Hans Herman'
    $aArray[12] = 'Abtielung Produktion, Kontrolle' ;Buchstabendreher

    [/autoit]

    [spoiler]

  • @ Andy,

    der Link mit dem Tutorial -> super, so etwas wollte ich haben.

    Zitat

    das einfachste wäre, direkt hier anzusetzen. Und zwar nicht die gesamte Tabelle einzulesen, sondern nur die Spalte mit "Name, Vorname".

    als Array habe ich nur die Spalte mit den Namen eingelesen! Ich hatte folgende Vorstellung: Wenn ich über eine Namen-Auswahlbox (die mit dem besagten Array gespeist wird) den Mitarbeiter ausgewählt habe, wollte ich in der Exceltabelle gehen und für den Mitarbeiter die Schicht entsprechend dem Kalendertag suchen und ausgeben. Soweit der Plan.

    Zitat

    Denn ich wäre sehr gespannt auf den Regex, der folgende Namen richtig filtert:

    So sah mein angepasster Demoarray nach dem Post von AMrK aus

    [autoit]

    $aArray[0] = 'chef'
    $aArray[1] = 'Nachname, Vorname'
    $aArray[2] = 0098300
    $aArray[3] = ''
    $aArray[4] = 'Mueller-Meier, Manfred'
    $aArray[5] = ''
    $aArray[6] = 'Abteilung Finanz, Personal'
    $aArray[7] = 'Abteilung Produktion, Kontrolle'

    [/autoit]

    was ich ausschließen kann, es gibt immer ein Leerzeichen zwischen Nachname," " und Vorname.

    MfG Jescho

    Jeder hat mal klein angefangen - aber nicht jeder kommt groß raus!

    • Offizieller Beitrag

    Wenn das alle verschiedenen Möglichkeiten sind, dann kannst Du das so machen (um das mit RegExp nicht noch komplizierter zu machen):

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>

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

    Dim $aArray[8]

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

    $aArray[0] = 'chef'
    $aArray[1] = 'Nachname, Vorname'
    $aArray[2] = 0098300
    $aArray[3] = ''
    $aArray[4] = 'Mueller-Meier, Manfred'
    $aArray[5] = ''
    $aArray[6] = 'Abteilung Finanz, Personal'
    $aArray[7] = 'Abteilung Produktion, Kontrolle'

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

    For $i = 0 To UBound($aArray) - 1
    If $aArray[$i] <> '' And StringRegExpReplace($aArray[$i], '\H+, \H+', '') = '' Then ConsoleWrite($aArray[$i] & @CR)
    Next

    [/autoit]
  • @Oskar thx top :thumbup:

    ich hoffe mal das ich mit Hilfe des "StringRegExp Tutorial / Reguläre Ausdrücke in AutoIt" und diesem Beispiel den Code bald verstanden habe. :pinch:

    MfG Jescho

    Jeder hat mal klein angefangen - aber nicht jeder kommt groß raus!