2016-03-22 17 views
1

Anstatt hart codierte Aufrufe wie im unten stehenden Code zu verwenden, ist es möglich, einen WRITE-Befehl innerhalb einer For-Schleife zu verwenden, um die Anzahl der Male auszugeben, die jedes Zeichen verwendet wird? Unten ist was ich geschrieben habe, was mir "A = n" geben wird, aber was ich möchte wäre "A = n", "B = n" usw., ohne dass es fest codiert ist.Zeichenzählung innerhalb einer Schleife

CHARCOUNT 
n str 
f r !,"Enter patient's name: ",str q:str="" d 
. s ^XPTNAME(str)="" 
w # 
f s str=$O(^XPTNAME(str)) q:str="" w !,"A = ",$L(str,"A") 
q 

Antwort

0

Nicht sicher, was genau Sie erreichen möchten, aber unter einigen Ideen.

COUNT() N array,char,key S key="" F S key=$O(^ZNAME(key)) Q:key="" D ; loop through all keys . S char="" . F I=1:1:$L(key) D ; loop through all letters .. S char=$E(key,I) ; extract the letter .. S array(char)=$G(array(char))+1 ; increment count S char="" F S char=$O(array(char)) Q:char="" D . W char,"=",array(char),! Q

Testing in GTM:

GTM>ZWR ^ZNAME 
^ZNAME("first,last")="Second Street" 
^ZNAME("name,surname")="First Street" 

GTM>d COUNT^ZZTEST 
,=2 
a=3 
e=2 
f=1 
i=1 
l=1 
m=2 
n=2 
r=2 
s=3 
t=2 
u=1 

Obwohl, wenn Sie Fall gemischt haben, können es anders, als Sie erwarten:

GTM>ZWR ^ZNAME 
^ZNAME("FIRST,LAST")="" 
^ZNAME("first,last")="Second Street" 
^ZNAME("name,surname")="First Street" 

GTM>d COUNT^ZZTEST 
,=3 
A=1 
F=1 
I=1 
L=1 
R=1 
S=2 
T=2 
a=3 
e=2 
f=1 
i=1 
l=1 
m=2 
n=2 
r=2 
s=3 
t=2 
u=1 

Hierzu den Code unten sehen, die sein kann spezifisch für GTM ($ ZCO-Funktion), auch in der Lage, Arrays oder Globals mit Beschränkung auf Single Key/Abonnement zu behandeln:

Code (Beachten Sie, dass die Verwendung von Arrays mit dem Namen der Variable, die intern in diesem Label verwendet wird, nicht funktioniert, zB "array", "char", "key", "overs", "where", da sie neu erstellt werden):

COUNTV2(where,upper) 
     N array,char,key 
     I $G(where)="" Q 
     ; loop through all keys 
     F S where=$Q(@where) Q:where="" D 
     .  S char="" 
     .  S key=$E(where,$F(where,"("),$L(where)-1) 
     .  I $E(key)="""" S key=$E(key,2,$L(key)-1) 
     .  I $G(upper) S key=$ZCO(key,"U") ; Convert to uppercase 
     .  F I=1:1:$L(key) D    ; loop through all letters 
     ..    S char=$E(key,I)  ; extract the letter 
     ..    S array(char)=$G(array(char))+1 ; increment count 
     S char="" 
     F S char=$O(array(char)) Q:char="" D 
     .  W char,"=",array(char),! 
     Q 

mit globalem Test:

GTM>ZWR ^ZNAME 
^ZNAME("FIRST,LAST")="" 
^ZNAME("first,last")="Second Street" 
^ZNAME("name,surname")="First Street" 

GTM>D COUNTV2^ZZTEST("^ZNAME",1) 
,=3 
A=4 
E=2 
F=2 
I=2 
L=2 
M=2 
N=2 
R=3 
S=5 
T=4 
U=1 

mit Array getestet:

GTM>zwr array2 
array2(12)="" 
array2("First")="" 
array2("lasT")="" 

GTM>D COUNTV2^ZZTEST("array2",1) 
1=1 
2=1 
A=1 
F=1 
I=1 
L=1 
R=1 
S=2 
T=2 

Deaktivieren Kraft Großbuchstaben:

GTM>D COUNTV2^ZZTEST("^ZNAME",0) 
,=3 
A=1 
F=1 
I=1 
L=1 
R=1 
S=2 
T=2 
a=3 
e=2 
f=1 
i=1 
l=1 
m=2 
n=2 
r=2 
s=3 
t=2 
u=1 

Wenn Sie zusätzliche Logik wollen nur Zeichen von A bis Z enthalten:

GTM>W $A("A") 
65 
GTM>W $A("Z") 
90 
GTM>S char="," 

GTM>I ($A(char)>64)&($A(char)<91) w char 

GTM>s char="A" 

GTM>I ($A(char)>64)&($A(char)<91) w char 
A 
GTM>S char="f" 

GTM>I ($A(char)>64)&($A(char)<91) w char 

GTM>s char="Z" 

GTM>I ($A(char)>64)&($A(char)<91) w char 
Z 
3

$length zählt Teile, die durch zweites Argument delimeted. In diesem Fall können Sie $char und $ascii verwenden.

+0

Vielen Dank !! –

Verwandte Themen