字符在循环内计数

时间:2016-03-22 20:06:02

标签: intersystems-cache mumps intersystems-cache-studio

不是像我在下面的代码中那样使用硬编码调用,是否可以在For循环中使用WRITE命令打印出每个字符使用的次数?下面是我写的,它会给我“A = n”,但我想要的是“A = n”,“B = n”等,而不是硬编码。

 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

2 个答案:

答案 0 :(得分:3)

$length计算由第二个参数划分的部分。在这种情况下,您可以使用$char$ascii

答案 1 :(得分:0)

不确定您想要实现的目标,但不确定。

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

在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

虽然如果你有混合案例,它可能会有所不同:

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

为此,请参阅以下可能特定于GTM($ ZCO函数)的代码,也能够处理限制为单键/订阅的数组或全局变量:

代码(注意使用带有此标签内部使用的变量名称的数组将不起作用,例如“array”,“char”,“key”,“upper”,“where”,因为它们将被新建):

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

使用全局测试:

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

使用数组测试:

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

禁用强制大写:

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

如果您希望其他逻辑仅包含字符A到Z:

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