Sas 宏观分辨率

Sas 宏观分辨率,sas,sas-macro,Sas,Sas Macro,我有一个宏,该宏解析为一个包含符号and的字符串,这会导致错误警告:明显的符号引用a未解析 比如说 Data _NULL_; T=%NRSTR("A&A"); call symput("test",T); run; %put &=test.; 有没有办法只解决一次?NR函数似乎删除了所有&的含义,并阻止任何解析。我只想解决一次 下面的示例可以工作,但我需要它作为数据步骤的一部分,因为有几个其他regex函数用于创建a&a字符串 %let Test=%NRSTR(A&A

我有一个宏,该宏解析为一个包含符号and的字符串,这会导致错误
警告:明显的符号引用a未解析

比如说

Data _NULL_;
T=%NRSTR("A&A");
call symput("test",T);
run;

%put &=test.;
有没有办法只解决一次?NR函数似乎删除了所有
&
的含义,并阻止任何解析。我只想解决一次

下面的示例可以工作,但我需要它作为数据步骤的一部分,因为有几个其他regex函数用于创建
a&a
字符串

%let Test=%NRSTR(A&A);
%put &test;

有什么想法吗?

在数据步骤中,对发送到宏环境的文本值进行单引号引用

为了防止将
&
解释为解析请求,在使用宏符号时,
%superq
将宏符号

Data _NULL_;
  T = 'A&A';
  call symput("test",T);
run;

%put NOTE: test macro symbol value is %superq(test);

---------- LOG ----------
21   %put NOTE: test macro symbol value is %superq(test);
NOTE: test macro symbol value is A&A

要解决第一次使用的问题,只需使用单引号。这将允许您创建带有符号和的宏变量

data _null_;
  call symputx('test','A&A');
run;
然后使用一些宏代码添加宏引用。我发现%SUPERQ()最简单

%let test=%superq(test);
如果在同一数据步骤中以这种方式生成大量宏变量,则可能需要使用RESOLVE()或CALL EXECUTE()函数,以便在创建宏变量后立即运行%LET

data _null_;
  set variable_list;
  call symputx(name,value);
  call execute(catx(' ','%let',name,'=%superq(',name,');'));
run;