循环中的字符计数
Character Counting within a loop
不是像我在下面的代码中那样使用硬编码调用,而是可以在 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
$length counts parts which delimeted by second argument. In this case you may use $char and $ascii.
不确定您想要实现什么,但低于一些想法。
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 函数)的代码,也能够处理数组或全局变量,但仅限于单个 key/subscription:
代码(注意,在这个标签中使用带有内部使用的变量名称的数组是行不通的,例如"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
不是像我在下面的代码中那样使用硬编码调用,而是可以在 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
$length counts parts which delimeted by second argument. In this case you may use $char and $ascii.
不确定您想要实现什么,但低于一些想法。
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 函数)的代码,也能够处理数组或全局变量,但仅限于单个 key/subscription:
代码(注意,在这个标签中使用带有内部使用的变量名称的数组是行不通的,例如"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