我正在尝试在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;
语句。我怎么能绕过这个?
非常感激。
答案 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循环仍然可以正常工作。