1

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

为此,我启用了多个输入(最多 10 个),并尝试利用此处&_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;

陈述。我怎样才能解决这个问题?

非常感谢。

4

2 回答 2

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;
于 2017-05-17T17:42:51.790 回答
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 循环仍将起作用。

于 2017-05-17T18:28:01.747 回答