FINDC() 中的“k”修饰符在 SAS 中如何工作?
Posted
技术标签:
【中文标题】FINDC() 中的“k”修饰符在 SAS 中如何工作?【英文标题】:How does the 'k' modifier in FINDC() work in SAS? 【发布时间】:2017-07-27 17:34:30 【问题描述】:我正在通读《SAS 函数示例 - 第二版》一书,由于示例和输出结果,我在尝试理解某个函数时遇到了困难。
函数:FINDC
目的:定位字符串中出现或未出现的字符。使用可选参数,您可以定义搜索的起点、设置搜索的方向、忽略大小写或尾随空格,或者查找列出的字符以外的字符。
语法:FINDC(character-value, find-characters <,'modifiers'> <,start>)
两个修饰符是i
和k
:
i
忽略大小写k
只计算不在查找字符列表中的字符
所以现在其中一个例子是这样的:
注意:STRING1
= "苹果和书籍"
FINDC(STRING1,"aple",'ki')
对于输出,他们说它返回1
,因为苹果中“A”的位置。然而,这让我感到困惑,因为我认为 k
修饰符说要在查找字符列表中查找 not 的字符。那么为什么它在查找字符列表中搜索a
时,忽略大小写的字母“A”是。对我来说,我觉得这个例子应该为 Apples 中的“s”输出6
。
有没有人能更好地向我解释k
修饰符,以及为什么这个答案的输出是1
而不是6
?
编辑 1
在线阅读SASdocumentation,我发现这个例子似乎与我正在阅读的书相矛盾:
示例 3:搜索字符并使用 K 修饰符 此示例搜索字符串并返回执行以下操作的字符 没有出现在字符列表中。
data _null_;
string = 'Hi, ho!';
charlist = 'hi';
j = 0;
do until (j = 0);
j = findc(string, charlist, "k", j+1);
if j = 0 then put +3 "That's all";
else do;
c = substr(string, j, 1);
put +3 j= c=;
end;
end;
run;
SAS writes the following output to the log:
j=1 c=H
j=3 c=,
j=4 c=
j=6 c=o
j=7 c=!
That's all
那么,这本书错了吗?
【问题讨论】:
这是内部一致性以没有多大意义的东西而告终的情况之一。k
这样做是因为它首先出现在 compress
中,它告诉 compress 而不是删除 [list] 中的字符,它应该 k
eep 它们。在这里使用k
是没有意义的,但因为它在compress
中已经意味着它,并且它保证我们不会有任何其他冲突......
【参考方案1】:
书错了。
511 data _null_;
512 STRING1 = "Apples and Books" ;
513 x=FINDC(STRING1,"aple",'ki');
514 put x=;
515 if x then do;
516 ch=char(string1,x);
517 put ch=;
518 end;
519 run;
x=6
ch=s
【讨论】:
以上是关于FINDC() 中的“k”修饰符在 SAS 中如何工作?的主要内容,如果未能解决你的问题,请参考以下文章