使用带有编号宏变量的 SAS SET 语句

Using SAS SET statement with numbered macro variables

我正在尝试在 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;

但是,我收到以下错误:

ERROR: Missing numeric suffix on a numbered data set list (WORK.SOME_INPUT_TABLE-WORK.ANOTHER_INPUT_TABLE)

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

要求的格式
SET dataset1 - dataset9;

声明。我该如何解决这个问题?

非常感谢。

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

%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;

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

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

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

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

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

数据步骤顶部的额外 CALL SYMPUTX() 将处理计数为一且 SAS 仅创建 _INPUT 宏变量而不是创建具有数字后缀的一系列宏变量的情况.这会将 _INPUT1 设置为 _INPUT 的值,以便 DO 循环仍然有效。