SAS 宏里各种 QUOTE 函数比较
(2012-11-05 15:30:07)
标签:
杂谈 |
分类: SAS_Quick_Tips |
个人感觉在 SAS 宏语言里最难掌握或者最易混淆的就是各种 QUOTE 函数的用法,刚好上周五帮同事看了一个跟QUOTE 相关的问题,借此机会将 QUOTE 的作用以及所有 QUOTE 函数的用法整理如下。
这是几位 SAS 用户在 SGF Paper 里面对 Macro Quoting 的感慨:
I have often said that anyone who thinks macro quoting is
simple, probably doesn't understand the
problem.
Macro quoting is hard because:
• Quoting is inherently a hard subject.
• The interaction between two languages makes quoting harder.
• The timing issues involved are complex, when the generated
language compiles and executes during the
generation of its code.
• There are two macro languages involved - the one which is
compiled between %MACRO and %MEND
statements and the one which executes immediately in open SAS
code.
• Bugs in the macro facility prevent recognition of a consistent
pattern of how macro quoting works.
原文 http://support.sas.com/resources/papers/proceedings10/029-2010.pdf
For programmers new to the SAS® Macro Facility, understanding
the set of Macro quoting functions and their appropriate uses can
be a difficult task.
原文 http://www2.sas.com/proceedings/forum2007/152-2007.pdf
一、为什么要 QUOTE ?
如果你的宏变量取值中包含特殊字符,比如 ; & % ' ( ) 等,那么你必须使用 QUOTE 函数,否则 SAS 代码执行时会出现语法错误、大量宏变量无法替换的警告信息、甚至错误结果。另外,如果你的代码需要在宏语言中处理包含中文字符的 http 链接,那么通常情况下你需要使用 QUOTE 函数。
比如下面的例子中,我们需要对四个宏变量赋值:
%let var1=a=1;b=2;;
%let var2=a&b;
%let var3=&var2;
%let var4=&var1&var2;
%put &var1;
%put &var2;
%put &var3;
%put &var4;
SAS 执行结果:
119
ERROR 180-322: Statement is not valid
or it is used out of proper order.
WARNING: Apparent symbolic
reference B not
resolved.
120
121
WARNING: Apparent symbolic reference
B not resolved.
122
WARNING: Apparent symbolic reference
B not resolved.
WARNING: Apparent symbolic reference B not
resolved.
123
a=1
124
WARNING: Apparent symbolic reference
B not resolved.
a&b
125
WARNING: Apparent symbolic reference
B not resolved.
a&b
126
WARNING: Apparent symbolic reference
B not resolved.
WARNING: Apparent symbolic reference B not
resolved.
a=1a&b
(注意:此结果不对)
正确的结果应当是:
132
a=1;b=2;
133
a&b
134
a&b
135
a=1;b=2;a&b
二、QUOTE 函数原理及其用法
QUOTE
背后的原理如下:SAS 系统所有的宏变量及其取值都存在一张表中,对于使用了 QUOTE 的字符 SAS 在存储时会给这些特殊字符加上前缀和后缀,SAS 宏处理器对该宏变量做字符串替换时把前缀和后缀去掉,用其原始值来完成替换。
三、样例代码
大家可以执行下面的代码,看看使用不同 QUOTE 函数得到的结果。
有问题的样例代码:
%let var1=%str(a=1;b=2;);
%let var2=%str(a&b);
%let var3=%str(&var2);
%let var4=%str(&var1&var2);
%put &var1;
%put &var2;
%put &var3;
%put &var4;
%let var1=%nrstr(a=1;b=2;);
%let var2=%nrstr(a&b);
%let var3=%nrstr(&var2);
%let var4=%nrstr(&var1&var2);
%put &var1;
%put &var2;
%put &var3;
%put &var4;
正确的样例代码:
%let var1=%str(a=1;b=2;);
%let var2=%nrstr(a&b);
%let var3=%bquote(&var2);
%let var4=%bquote(&var1&var2);
%put &var1;
%put &var2;
%put &var3;
%put &var4;
有问题的样例代码:
data _null_;
run;
%let var3=%bquote(&var2);
%let var4=%bquote(&var1&var2);
%put &var1;
%put &var2;
%put &var3;
%put &var4;
正确的样例代码:
data _null_;
run;
%let var1=%superq(var1);
%let var2=%superq(var2);
%let var3=%nrbquote(&var2);
%let
var4=%nrbquote(&var1&var2);
%put &var1;
%put &var2;
%put &var3;
%put &var4;