1. %str 和 %nrstr
%str(character-string) %nrstr(character-string)
这两个函数属于 Macro quoting function, 作用是:在宏编译时,当存在特殊字符影响到宏编译的结果时,将其放入这两个函数中就可以掩盖这些字符。可以掩盖的字符有:
除此之外,%NRSTR 还可以掩盖 & 和 % . 注意:如果是不成对的引号或括号,在%STR 或 %NRSTR 中使用时,必须在其前面添加符号%。
例子:
%let a=%str(this is test);
%let b=%str( this is test);
%let c=%str('this is test');
%let d=%str(proc print;run;);
Reference : Macro Quoting: %STR and %NRSTR Functions (sas.com)
2. %sysfunc
%SYSFUNC (function(argument(s))<, format> )
%QSYSFUNC (function(argument(s))<, format> )
作用是:在宏语句里执行函数。
例子:
/*普通函数需要引号的,放进sysfunc后无需添加引号*/ dsid=open("sasuser.houses","i"); dsid=open("&mydata","&mode"); %let dsid = %sysfunc(open(sasuser.houses,i)); %let dsid=%sysfunc(open(&mydata,&mode));
%SYSFUNC 无法掩盖特殊符号,%QSYSFUNC 可以掩盖下列特殊符号:
当%SYSFUNC或%QSYSFUNC引用的函数需要数值型参数时,参数会被自动转化成数值型。还有一些无法被%SYSFUNC或%QSYSFUNC使用的SAS函数:
Instead of INPUT and PUT, which are not available with %SYSFUNC and %QSYSFUNC, use INPUTN, INPUTC, PUTN, and PUTC.
3. %scan 和 %qscan
%SCAN(argument, n<,charlist <,modifiers> > ) %QSCAN(argument, n<,charlist <,modifiers> > )
这两个函数的作用是:在一个字符串中根据某个词所在的位置查找该词,每个词由分隔符分隔。
%SCAN 无法掩盖特殊符号,%QSCAN 可以掩盖下列特殊符号:
例子:
%let name=%str(Marry*James*Black); /*remove %str() is okay because macro processor can deal charater without quotation*/
%put &name; /* Marry*James*Black */
%let firstname=%scan(&name,1,%str(*));
%let midname=%scan(&name,2,%str(*));
%let lastname=%scan(&name,3,%str(*));
data test;
firstname="&firstname"; /*must be quoted*/
midname="&midname";
lastname="&lastname";
run;
Reference : %SCAN and %QSCAN Functions :: SAS(R) 9.3 Macro Language: Reference
4. %sysevalf 和 %eval
%SYSEVALF(expression<, conversion-type>) /*conversion-type是浮点计算类型*/ %EVAL(expression)
这两个函数的作用是:在宏语句里求算数运算和逻辑运算的值,返回的结果是文本。%SYSEVALF 可以计算浮点数,%EVAL只能计算整数,因此当有浮点数时必须使用%SYSEVALF。%EVAL 是SAS默认的计算方式。%SYSEVALF 是唯一可以计算包含浮点数或缺失值的逻辑运算的函数。
%SYSEVALF 的 conversion-type 有四种:BOOLEAN,CEIL,FLOOR,INTEGER。如果不定义 conversion-type,返回的结果类型不变。
%sysevalf(1/3,boolean) /* returns 1 */ %sysevalf(1 + 1.1,ceil) /* returns 3 */ %sysevalf(-2.4,floor) /* returns -3 */ %sysevalf(2.1,integer); /* returns 2 */
Reference :Macro Functions: %SYSEVALF Function (sas.com)
Other reference : SAS学习笔记44 宏函数 - 特殊的苹果 - 博客园 (cnblogs.com)