【问题标题】:SAS Macro Variable Quoted ConcatenationSAS 宏变量引用连接
【发布时间】:2015-12-09 18:21:32
【问题描述】:

我正在调试我正在编写的宏,它将根据用户输入将字符串视为数据集名称的前缀或后缀。然后,引用的结果将被馈送到下游的另一个进程中。

因此,如果用户说 Type=1 并提供字符串“data_”,则结果宏变量的输出将为“data_%”。

我已经尝试了以下代码的几个不同的迭代,但不能完全理解它....任何帮助将不胜感激。谢谢。

%let Type=1;
%let TableName=data_;

data _null_;
   if &Type=1 then 
      call symput('qTableName',%unquote(%str(%')(cats(&TableName.,"%"))%str(%')));
   else if &Type=2 then 
      call symput('qTableName',%unquote(%str(%')(cats("%",&TableName.))%str(%')));
run;

%put &qTableName;

【问题讨论】:

  • 既然您使用的是数据步骤,为什么还要使用所有这些宏功能? call symputx('qtablename',cats(symget('TableName'),'_%'))。生成的宏变量中的值是否也是单引号的一部分?

标签: macros sas sas-macro


【解决方案1】:

看起来您正在尝试向宏变量添加单引号。

%let TableName=data_;
%let qTableName='data_%';

所以在数据步骤中您可以使用CATQ()

data _null_;
   call symputx('qTableName',catq('1a',cats(symget('TableName'),'%')));
run;

或者在简单的宏代码中只使用%bquote() 允许您添加'% 而不会阻止宏变量扩展。但您可能想删除它会导致的宏引用。

%let qTableName=%unquote(%bquote('&TableName%'));

或者,如果您只想在 &TYPE=1 时添加 %,那么也许您可以调用 IFC() 函数。我相信%sysfunc() 调用将删除宏引用。

%let Type=1;
%let qTableName=%sysfunc(ifc(&type=1,%bquote('&TableName%'),%bquote('&TableName')));

【讨论】:

  • 谢谢,汤姆。您在数据步骤中提供的解决方案非常适合我的需求。
猜你喜欢
  • 1970-01-01
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多