%macro getName;
%let name = %sysfunc(translate(&val, __, -/));
%mend;
%macro loopit(mylist);
%let else=;
%let name=;
%let n = %sysfunc(countw(&mylist, %str( )));
data
%do I=1 %to &n;
%let val = %scan(&mylist,&I, %str( ));
%getName
mydata_&name
%end;
other
;
set mydata;
%do j=1 %to &n;
%let val = %scan(&mylist,&j, %str( ));
%getName
%if &j ne 1 %then %do;
%let else=else;
%end;
&else if code = "&val" then output mydata_&name;
%if &j = &n %then %do;
else output other;
%end;
%end;
run;
%mend;
options mprint;
%let list=a-a b/b c-;
%loopit(&list);
此版本使用COUNTW
和SCAN
功能与修饰符仅使用空格 ( %str( )
) 作为单词分隔符。
还使用新的宏getName
根据 SAS 命名规则为数据集命名(注意%let name = ;
只需在内部提供变量%loopit
以%getName
进行填充)。
%getName
将不允许的字符转换为下划线(如果您使用不同的分隔符具有相同的值,则此处可能存在名称冲突)。