occ() - Häufigkeit/occurrence

Veröffentliche deine funktionierenden Skripte und Funktionen

Moderator: jNizM

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

occ() - Häufigkeit/occurrence

Post by BoBo » 24 Feb 2022, 04:35

tl:dr - string comparison counter that is case sensitive and provides the option to be used with a ternary operator.

Zur Ermittlung der Anzahl gesuchter String-Bestandteile fiel mir ad-hoc erstmal :arrow: StrReplace() ein.

Hier nachfolgend eine alternative Lösung, mittels :arrow: StrSplit().
Interessanterweise arbeitet dieser Befehl sogar ...
a) case-sensitive, sowie ...
b) als boolean-Ausgabe für Fälle wie 'If str/var in Matchlist',
c) ermöglicht für einen solchen Fall die Verwendung mit ternary operator, und ...
d) kann durch parsen der EOL-chars eine Zeilenanzahl ermitteln.

:thumbup:

Code: Select all

#SingleInstance, Force

line:=" 
(
Germany Germany Germany;Berlin
France France France;Paris
Ukraine Ukraine,Kiyw
)"


MsgBox % occ(line,";")					; semi-colon				= 2
MsgBox % occ(line,A_Space)				; leerzeichen				= 5
MsgBox % occ(line,["er","ra","i"])		; zeichenkette er + ra + i	= 14
MsgBox % occ(line,chr(71))				; zeichen "G"				= 3
MsgBox % occ(line,"germany")			;"germany"					= 0
MsgBox % occ(line,"Germany")			;"Germany"					= 3
MsgBox % occ(line,"`r`n")				; CRLF						= 0
MsgBox % occ(line,"`r")					; CR						= 0
MsgBox % occ(line,"`n")					; LF						= 2
MsgBox % occ(line)						; zeichen					= 76
msg:=occ(line,"Kiyw") ? "yep" : "nope"	;"If var in Matchlist"		= yep
	MsgBox % msg
if !occ(line,"x")						; 1 (true, da 'nicht vorhandenes x' bestätigt)
	ToolTip % "Yep, there is none!"
if occ(line,"x")						; 0 (false, da 'x vorhanden' nicht bestätigt)
	ToolTip % "No, there is none"		; wird demnach nicht angezeigt


occ(str, sep:="",oChar:="`n") {
	res := StrSplit(str,sep,oChar)
	return (sep="") ? res.Count() : res.Count()-1
	}
HTH

8-)

Update:
a) durch Verwendung von oChar:="`n" wird das Zählen von 'New-Line' EOL's ('Zeilenendezeichen') abgeschaltet. Woraus sich im Beispiel für die Gesamtzahl an Zeichen 76 anstatt 78 ergibt.
b) mit Übergabe von 'needles' in Array-Schreibweise (Zeile 13) lässt sich im 'haystack' wie für StrSplit() üblich, nach mehreren Zeichen gleichzeitig suchen/zählen.

halweg
Posts: 93
Joined: 17 Apr 2018, 10:34
Location: Dresden

Re: occ() - Häufigkeit/occurence

Post by halweg » 24 Feb 2022, 04:59

Besten Dank, kann man gut gebrauchen...

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: occ() - Häufigkeit/occurrence

Post by BoBo » 25 Feb 2022, 09:24

Wird die Array-Schreibweise zur Parameterübergabe verwendet StrSplit(haystack,["needle1",needle2]) wird das Ergebnis nach 'OR'-Vergleich ausgegeben.

Code: Select all

line := "Kiyw;Berlin"

msg:=occ(line,["Kiyw","Berlin"]) ? "yep" : "nope"		; yep, da beide Suchpattern ('Kiyw' und 'Berlin') matchen.
	MsgBox % msg

msg:=occ(line,["Kiyw"," Berlin"]) ? "yep" : "nope"		; yep, da zumindest ein Suchpattern ('Kiyw') matched.
	MsgBox % msg

msg:=occ(line,["Kiyw "," Berlin"]) ? "yep" : "nope"		; nope, da kein Suchpattern (weder 'Kiyw' noch 'Berlin', wegen unzutreffender Leerzeichen) matched. 
	MsgBox % msg
	
	
occ(str, sep:="",oChar:="`n") {
	res := StrSplit(str,sep,oChar)
	return (sep="") ? res.Count() : res.Count()-1
	}

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: occ() - Häufigkeit/occurrence

Post by BoBo » 25 Feb 2022, 10:56

Parameterübergabe mittels Array-Schreibweise ermöglicht es, Dateien in einem Rutsch nach String-Pattern (z.B. der Dateiendung als Dateinamensbestandteil) zu zählen.
Bitte beachten, StrSplit() aggiert auch hier 'case sensitive'!

Code: Select all

i:=0
Loop, Files, C:\*.*
 	occ(A_LoopFileName,[".sys",".tmp",".log"]) ? ++i : i		; zählt *.sys *.tmp *.log-Dateien (case sensitive!)
MsgBox % i

occ(str, sep:="",oChar:="`n") {
	res := StrSplit(str,sep,oChar)
	return (sep="") ? res.Count() : res.Count()-1
	}
Hier wurde "gemischt" gefahren, d.h., die Loop-wildcard begrenzt auf den file type (non-case sensitive), während StrSplit() case-sensitive mitzählt.
Ausgabe hier: Anzahl der von StrSplit() gemäß String-Pattern ermittelten , gegen die Gesamtanzahl aller Dateien gemäß Loop-wildcard.

Code: Select all

i:=0, g:=0
Loop, Files,% A_ScriptDir . "\*.ahk"
	{ 	occ(A_LoopFileName,[".AHK","AhK","aHk"]) ? ++i : i
		++g
;		l .= A_LoopFileName "`n"
	}
MsgBox % l "`n" i "/" g


occ(str, sep:="",oChar:="`n") {
	res := StrSplit(str,sep,oChar)
	return (sep="") ? res.Count() : res.Count()-1
	}

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: occ() - Häufigkeit/occurrence

Post by BoBo » 12 Mar 2022, 03:55

Und hier der "zählende Einzeiler" MsgBox % StrSplit("aaAbbBccC","A").Count()-1 ; Ergebnis: 1. Ermittelt demnach 'case sensitive' :)

Post Reply

Return to “Skripte und Funktionen”