• Offizieller Beitrag

    Das hier aus deiner Testsuite erscheint mir auch fehlerhaft:
    _Check(16, _StringStrCount("test TEST Test TestTest", "T;E,S", True, False, ";,", True), "3;10;5;5")

    Hier werden 2 Zeichen als Trenner übergeben, also ist nur diese gesamte Zeichenfolge der Trenner. Im Teststring ist dieser Trenner nicht enthalten.
    Du kannst nicht auch noch für jeden Teilstring einen extra Trenner übergeben.

    Der letzte Block weist mehrere Fehler auf:
    _Check(13, _StringStrCount("test TEST Test TestTest", "TEST Test", False, False, "", True), "1;3") ; ni.Sens nach "TEST Test"='1;1'
    _Check(14, _StringStrCount("test TEST Test TestTest", "TEST Test", False, False, " ", True), "2;5;5") ; ni.Sens nach "TEST" u."Test"='2;3;3'
    _Check(15, _StringStrCount("test TEST Test TestTest", "T;EST", False, False, ";", True), "2;10;5") ; ni. Partial "T" u. "EST" ==> 0
    _Check(16, _StringStrCount("test TEST Test TestTest", "T;E,S", False, False, ";,", True), "3;10;5;5") ; kein Ergebnis (Trenner= ;,)
    _Check(17, _StringStrCount("Testat, testen, Test, Attest. Ostestland", "Test", False, False, "", False), 5) ; ni.Sens nach "Test"=1


    Edit
    Bei der Rückgabe als String und mehreren Suchbegriffen wird bisher (wenn ich das aus der Testsuite richtig herausgelesen habe) die Summe aller gefundenen Einzelbegriffe zurückgegeben.
    Wäre es da nicht evtl. sinnvoller die Einzelsummen getrennt durch den übergebenen Delimiter zurückzugeben? Das würde dann auch der Rückgabe bei Array entsprechen.
    Hier mal mein Vorschlag um es nochmal eindeutig zu definieren.

    • Offizieller Beitrag
    Zitat

    Bei der Rückgabe als String und mehreren Suchbegriffen wird bisher (wenn ich das aus der Testsuite richtig herausgelesen habe) die Summe aller gefundenen Einzelbegriffe zurückgegeben.
    Wäre es da nicht evtl. sinnvoller die Einzelsummen getrennt durch den übergebenen Delimiter zurückzugeben? Das würde dann auch der Rückgabe bei Array entsprechen.


    Das finde ich nicht so gut.

    Ich finde das so besser: Entweder Gesamtsumme ($bReturn = False, als Einzelwert) oder als getrennte Summen ($bReturn = True, dann als Array).

    Es wäre jetzt kein Problem mein Script nach Deinen Vorgaben zu ändern, aber ich finde das mit der Gesamtsumme praxistauglicher. Wenn ich die Anzahl der Suchbegriffe ermitteln will, bekomme ich dann gleich einen Wert mit dem ich weiterrechnen kann, ohne ihn erst aufsplitten zu müssen.

    Den Rest Deiner Bedingungen erfüllt mein Script. :)

    Hier:

    Zitat

    $bPartial True = Suchbegriff auch als Teilstring / False = Suchbegriff alleinstehend


    gibt es aber noch eine Diskrepanz zu den Bedingungen von Eukalyptus. Bei ihm ist das genau umgekehrt definiert. Wobei ich Deine Definition besser finde. $bPartial = True sagt für mich aus, dass auch Teile zugelassen sind.

    Edit:
    Wäre als Funktionsname nicht "_StringInStrCount" passender (in Anlehnung an "StringInStr")?

  • Neue TestSuite in Post #1

    Ich sehe keinen Vorteil, wenn bei String-Rückgabe die Ergebnisse getrennt sind. --> Also Gesammtsumme!

    Der Suchbegriff muß bei nicht-partial-Suche auch gefunden werden, wenn ihm ein Satzzeichen folgt.

    Eine weitere Frage drängt sich auf:
    Wenn $sSearch = Leerstring, dann sollen alle Zeichen gezählt werden.
    Sollen in diesem Fall auch die @lf,@cr und/oder Leerzeichen mitgezählt werden.
    Das wäre dann kein Unterschied zu StringLen!

    Was wäre denn praxisorientiert?

    lgE

    • Offizieller Beitrag

    Ein Leerstring als Suchwort ist an sich schon nicht praxisorientiert, IMHO. Mir fällt jedenfalls kein Beispiel ein, wo man sowas gebrauchen könnte.
    Ich würde sogar so weit gehen zu sagen, dass dann eine Fehlermeldung zurückgegeben werden sollte.
    Und wie Du ja bereits geschrieben hast, gibt es für die Stringlänge bereits einen Befehl.

    • Offizieller Beitrag

    Das verrate ich hier nicht. :P
    Nachher geben wir alle das gleiche Script ab. ;)

    Edit: Mein Script besteht Deinen Test übrigens fehlerfrei.

    Edit2: Sollte man nicht noch einen Timer starten?

    [autoit]


    $iTimer = TimerInit()
    _Check(1, _StringInStrCount($sText, "und", False, False, "", False), 8)
    ; [...]
    _Check(17, _StringInStrCount($sText, "", False, True, " ", False), 104)
    ConsoleWrite(TimerDiff($iTimer) / 1000 & @CRLF)

    [/autoit]
  • Hallo,

    Zitat

    Der Suchbegriff muß bei nicht-partial-Suche auch gefunden werden, wenn ihm ein Satzzeichen folgt.

    Diese "Satzzeichen" und auch die erlaubte Position vor/hinter dem Suchstring sollte m.E. definiert werden.

    Ich wäre dafür die Satzzeichenklasse [:punct:] und auch alle Ascii-Zeichen kleiner 33 (beinhaltet alle Leer- und Steuerzeichen) sowohl vor dem Suchbegriff als auch hinter dem Suchbegriff stehend als Treffer bei Partial=FALSE zuzulassen.
    ciao
    Andy

  • Meine Funktion erfüllt alle Tests ;)
    Ich habe aber noch eine Frage was ist mit einem Delimiter mit mehreren Zeichen? Wird dann jedes Zeichen als einzelnes Trennzeichen behandelt oder alles als ein Trennstring?

  • Zitat

    Ich habe aber noch eine Frage was ist mit einem Delimiter mit mehreren Zeichen? Wird dann jedes Zeichen als einzelnes Trennzeichen behandelt oder alles als ein Trennstring?


    Ich behandele den Delimiter als kompletten String:
    string="aT_T_Tb" suchstring="" delimiter="T_T" => ergebnis= 2 (a und b) d.h. alle ausser der Delimiterstring


  • Ich behandele den Delimiter als kompletten String:
    string="aT_T_Tb" suchstring="" delimiter="T_T" => ergebnis= 2 (a und b) d.h. alle ausser der Delimiterstring


    So hab ich das auch, nur zu Beginn war glaub ich in dem Testpaket ein Test drin wo es getrennt ausgewertet wurde. Der ist zwar rausgeflogen, aber ich frag besser noch mal nach ;)

    PS: mein Skript hat bis jetzt von Func bis EndFunc 27 Zeilen.

  • Zitat

    PS: mein Skript hat bis jetzt von Func bis EndFunc 27 Zeilen.

    Jaja, macht mich nur fertig mit eurem RegEx-Gedöns :D
    Habe 46 Zeilen "zu Fuß" nur mit den Standard-Stringbefehlen. Mal sehen was Geschwindigkeitsmäßig drin ist, wenn die Suche auf eine 1 MB große Datei ausgedehnt wird :rolleyes:
    ciao
    Andy (*doch zu StringRegExp rüberschiel*)

    *edit*
    habs getestet mit einer 1,7MB grossen html-Datei(zusammenkopiert). Ich finde in 0,7 Sekunden mit
    $test=_StringinStrCount($string,"der die das ret <div",false,true," ",false) genau 7600 Fundstellen....
    Das Laden der Datei mit fileread() dauert wesentlich länger^^
    Finden von allen Zeichen ausser "e" dauert 5 Sekunden und findet 1,6 mio Treffer.
    2,5 Ghz AMD

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (1. Juli 2009 um 16:39)

  • Ich bleib am Ball, habe mein Script durch RegEx schon ziemlich zusammenstreichen können^^
    Wahrscheinlich lacht ihr euch über die Konstruktionen tot, aber ich übe ja noch :thumbup:
    Die Geschwindigkeit ist gleich geblieben.