【函数】SAS宏的特殊字符引⽤【转载】
原⽂地址  :
在SAS宏中,字符串是⽤双引号括起来的,但如果字符串中要包含双引号或百分号等特殊字符就要使⽤单引号来对字符串中的特殊字符逃逸。⽐如:
%let test = ‘”A” is the first character !’;
但如果字符串中包含单引号,则上述⽅法便失效了。所以更⼀般的,SAS提供了%str和%nrstr来对特殊字符转义。其中%str可以转义逗号,单双引号,左右⼩括号,波浪号,分号,空格,尖⾓号等,⽽%nrstr除了可以转义%str能够转义的特殊符号,还可以转义与(&)符号和百分号。具体的使⽤⽅法如:
%let test=%str(“A” is the first character!);
需要注意的是,当使⽤%str时,如果引⽤的字符串包含有不匹配的单双引号,括号,必须使⽤百分号转义,如:
%let test=%str(I%’m consultant.);
当然,笔者为了怕出错误,%str中凡是遇到特殊字符都⽤百分号转义了,如:
%macro doit;
X “%str(copy %”a%” %”b%”)”;
%mend doit
最为特殊的符号是百分号本⾝,如果要在%str中包含百分号,同时⼜不让SAS将其及其后%的字符看成是宏名或宏调⽤,请⽤百分号对百分号进⾏转义,也就是⽤两个百分号来表⽰⼀个百分号,如:
%let test = %str(%“%%%” is a special character!);
测试⼀下:
data _null_;
put “&test”;
run;
Log窗⼝是不是打印出来”%” is a special character!字样了呢?
%str和%nrstr对常量是有效的,如果是变量的话,%str和%nrstr则不会对变量的内容进⾏转义。这种情况下,我们需要%bquote
和%nrbquote,这两个statement则专门在宏扩展之后,宏执⾏的时候对变量对应的内容进⾏转义,⽐如:
%let test = %str(%”%%);
%macro dd(h=);
data _null_;
记住我%let a = %nrbquote(%substr(&h.,1,1));
put “&a.”;
run;
%mend dd;
%dd(h=&test.);