使用带有编号宏变量的

时间:2017-05-17 17:27:08

标签: sas sas-macro sas-dis

我正在尝试在SAS DI Studio中创建自定义转换,以执行一些我希望经常重复使用的复杂处理。为了实现这一点,作为第一步,我试图复制简单APPEND转换的功能。

为此,我启用了多个输入(最多10个),并尝试利用引用here&_INPUTn&_INPUT_count宏变量。我想简单地使用代码

data work.APPEND_DATA / view=work.APPEND_DATA;
   %let max_input_index = %sysevalf(&_INPUT_count - 1,int);
   set &_INPUT0 - &&_INPUT&max_input_index;
   keep col1 col2 col3; 
run;

但是,我收到以下错误:

  

错误:编号数据集列表中缺少数字后缀(WORK.SOME_INPUT_TABLE-WORK.ANOTHER_INPUT_TABLE)

因为宏变量被解析为它们引用的数据集的名称,其名称不符合

所需的格式
SET dataset1 - dataset9;

语句。我怎么能绕过这个?

非常感激。

2 个答案:

答案 0 :(得分:2)

您需要创建一个循环遍历列表并解析变量的宏。像

这样的东西
%macro list_tables(n);
   %do i=1 %to &n;
      &&_INPUT&i
   %end;
%mend;

data work.APPEND_DATA / view=work.APPEND_DATA;
   %let max_input_index = %sysevalf(&_INPUT_count - 1,int);
   set %list_tables(&max_input_index);
   keep col1 col2 col3; 
run;

答案 1 :(得分:0)

SET语句需要一个实际数据集名称列表,因为它们可能不会形成一系列数字后缀名称。

如果已经在运行宏,则可以使用宏%DO循环。确保在%DO循环内不生成任何分号。

set 
%do i=1 %to &_inputcount ; &&_input&i %end;
;

但是你也可以使用数据步骤将名称连接成一个宏变量,然后在SET语句中使用它。

data _null_;
  call symputx('_input1',symget('_input'));
  length str $500 ;
  do i=1 to &_inputcount;
    str=catx(' ',str,symget(cats('_input',i)));
  end;
  call symputx('_input',str);
run;
data .... ;
  set &_input ;
  ...

数据步骤顶部的额外CALL SYMPUTX()将处理count为1时的情况,SAS仅创建_INPUT宏变量,而不是使用数字后缀创建一系列宏变量。这会将_INPUT1设置为_INPUT的值,这样DO循环仍然可以正常工作。