Filtern einer Array - Teil-String - instring

  • Hallo,

    (1) offen

    nach langer Suche habe ich hier

    Filtern einer Array

    eine Array Suche gefunden, die fast genau das macht, was ich suche.

    Was muss ich in Zeile 59 ändern, damit instring ein Suchbegriff (Teilzeichenkette) gefunden wird, z.B. das Wort "Spezial"?

    so geht es nicht

    If StringInStr (StringSplit($aFile[$i], "|", 3)[1], StringLen($sOldInput)) = $sOldInput Then ; instring Suche

    (2) edit: erledigt -Dank Kanashius verstanden (Script aus der Hilfe funktioniert, daher das Beispiel gelöscht)

    Danke :)

    5 Mal editiert, zuletzt von AutoMit (9. Juli 2016 um 20:17)

  • 1.
    Das ist eine ganz blöde Idee:

    AutoIt
    Local $aLVItems[0]
    $aFile = StringSplit($sFile, @CRLF, 3)
    For $i = 0 To UBound($aFile) - 1
    	ReDim $aLVItems[UBound($aLVItems) + 1]
    	$aLVItems[UBound($aLVItems) - 1] = GUICtrlCreateListViewItem($aFile[$i], $ListView1)
    Next

    Bei jedem ReDim wird das gesamte Array in ein neues kopiert, dass dann ein Feld größer ist.
    So schreibt man soetwas:

    AutoIt
    $aFile = StringSplit($sFile, @CRLF, 3)
    Local $aLVItems[UBound($aFile)]
    For $i = 0 To UBound($aFile) - 1
    	$aLVItems[$i] = GUICtrlCreateListViewItem($aFile[$i], $ListView1)
    Next

    Dann wird nur einmal ein Array erstellt und befüllt.
    Bzw. Bei dem mit der Bedingung:

    AutoIt
    $aFile = StringSplit($sFile, @CRLF, 3)
    Local $aLVItems[UBound($aFile)];Maximal größe
    local $count=0
    For $i = 0 To UBound($aFile) - 1
    	if blub then
    		$aLVItems[$i] = GUICtrlCreateListViewItem($aFile[$i], $ListView1)
    		$count+=1
    	endif
    Next
    ReDim $aLVItems[$count];Überflüssiges wegschneiden

    Dann wird nur einmal das Array erstellt, mit so viel Platz wie maximal nötig ist und am Ende alles überflüssige wieder abgeschnitten.
    ->Nur 2x Array neu erstellt, bzw. kopiert.

    Das andere erhöht die Ladezeit mindestens exponentiell für jede Zeile in der eingelesenen Datei.

    Desweiteren gibt es extra funktionen für Listviews:
    _guictrllistview_deleteAllItems -> löscht alle Items der Listview
    Dann musst du die Controls garnicht in ein Array speichern.

    Was das suchen angeht:
    Dein Testscript funktioniert doch!
    Es wird 0 zurückgegeben. der 0te Eintrag ist der erste Arrayeintrag, der das gesuchte enthält.
    Wenn du bei Arraysearch den Startparameter erhöhst ($iStart), dann geht das gefundene auch mit hoch.
    Wenn -1 zurückgegeben wird, wird kein Eintrag gefunden.

  • Danke Kanashius für Deine Tipps !

    zu (1)

    ich hoffe, das ist nicht untergegangen ... das erste Script ist von alpines, und er hat dazu im oben verlinkten Beitrag geschrieben

    "Hier mal eine richtig schlampige Version davon:"

    Dennoch ist es das beste Script, was ich finden konnte, um aus einer Textliste nur noch jene Zeilen anzuzeigen, die den Suchstring enthalten.

    In Ermangelung eines besseren Scripts reicht mir vorerst die Anpassung der Zeile 59, um den instring Befehl zu nutzen - wißt Ihr wie?

    4 Mal editiert, zuletzt von AutoMit (9. Juli 2016 um 20:36)

  • If StringInStr (StringSplit($aFile[$i], "|", 3)[1], StringLen($sOldInput)) = $sOldInput Then ; instring Suche

    Das kann so eigentlich gar nicht funktionieren. Stringsplit liefert keinen String zurück, sondern ein Array.
    Und ein bestimmtes Array ruft man mit diesen [] Klammern auf.
    Also erst $aVariable = Stringsplit(blabla)
    und dann die If StringinStr() Abfrage.


    Edit: Ausserdem ist deine Zeile 59 gar nicht die, nach der du gefragt hast! Du hast geschrieben If StringInStr(....) aber deine Zeile 59 beginnt mit StringLeft...
    Was denn nun?

  • Das kann so eigentlich gar nicht funktionieren. Stringsplit liefert keinen String zurück, sondern ein Array.

    Es kann funktionieren, siehe dieses Testskript:

    Code
    $sTestString='Dies ist ein Test'
    MsgBox(0,'StringSplit-Test',StringSplit($sTestString,' ')[1])
    MsgBox(0,'StringSplit-Test',StringSplit($sTestString,' ')[2])
    MsgBox(0,'StringSplit-Test',StringSplit($sTestString,' ')[3])
    MsgBox(0,'StringSplit-Test',StringSplit($sTestString,' ')[4])

    und es funktioniert wenn wie oben und auch im Snipet von @AutoMit direkt auf ein Element des zurügegebenen Arrays zugegriffen wird. Da kein Errorhandling eingebaut (und in der Kurzschreibweise auch nicht einbaubar), setzt es aber voraus das die Daten 100% dem erwartenten Muster enstsprechen.

  • Vielen Dank für Eure interessanten Ausführungen!

    Bitte schreibt doch, wie Ihr einen Text effizient filtert (instring Suche), so dass Ihr nach Zeichenketten filtern könnt?

    deine Zeile 59

    Die Zeile 59 ist im ersten Post

    "If StringLeft(StringSplit($aFile[$i], "|", 3)[1], StringLen($sOldInput)) = $sOldInput Then"

    möchte ich ersetzen durch einen "StringInStr" Befehl - nur bekomme ich das leider nicht hin.

  • Bitte schreibt doch, wie Ihr einen Text effizient filtert (instring Suche), so dass Ihr nach Zeichenketten filtern könnt?

    Ich weiß, wie sehr du meine Antworten liebst, drum schreibe ich eine: Reguläre Ausdrücke.

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Wenn schon ein Array vorhanden ist, warum benutzt du dann nicht _ArraySearch oder _ArrayFindAll? Beide können nach Teilstrings innerhalb von SubItems (Spalten) suchen.

  • Er/Sie möchte wie immer, die fertige Lösung präsentiert bekommen. Daher sind die naheliegenden Vorschläge zur Selbsthilfe von autoBert (_ArraySearch oder _ArrayFindAll) leider nicht ausreichend. Vielleicht würde AutoMit die Hilfe helfen. Aber das ist natürlich Quatsch. Die mag er/sie ja nicht..

    Grüße autoiter

  • Er/Sie möchte wie immer, die fertige Lösung präsentiert bekommen. Daher sind die naheliegenden Vorschläge zur Selbsthilfe von autoBert (_ArraySearch oder _ArrayFindAll) leider nicht ausreichend. Vielleicht würde AutoMit die Hilfe helfen. Aber das ist natürlich Quatsch. Die mag er/sie ja nicht..

    Falsch. Wir alle haben nur nicht verstanden, wie man hilft. AutoMit weiß, wie man richtig helfen muss, und jeder von uns tut es falsch.

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • @autoiter & @Xorianator: könnt ihr bitte einmal aufhören gegen AutoMit zu bashen? Nicht jeder hat wie ihr einen IQ von 160++!
    Wenn ihr nicht helfen wollt einfach nicht antworten. Und das immer Lösungen im Entwicklerforum gesucht und prompt gepostet werden zähle ich auch dazu, zumindest wenn es hier auch gute Lösungen gibt.

    Danke falls ihr beide (und alle anderen) dies in Zukunft beachtet, aber dies mußte imho wirklich einmal gesagt werden,

    also nicht für Ungut Gruß (auto)Bert