使用带有编号宏变量的 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 循环仍然有效。
我正在尝试在 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 循环仍然有效。