我过去常常使用%do ... %to
而且效果很好,但是当我尝试列出所有没有%to
的字符值时,我收到了一条消息ERROR: Expected %TO not found in %DO statement
%macro printDB2 ;
%let thisName = ;
%do &thisName = 'Test1' , 'Test2' , 'Test3' ;
proc print data=&thisName ;
run ;
%end ;
%mend printDB2 ;
我知道如何使用%to
或%while
完成此任务。但我很好奇是否可以列出%do
中的所有字符值?我怎么能这样做?
答案 0 :(得分:3)
如果您的目标是在某些宏逻辑中循环一系列字符值,您可以采用的一种方法是定义相应的顺序命名的宏变量并循环遍历这些变量,例如。
%let mvar1 = A;
%let mvar2 = B;
%let mvar3 = C;
%macro example;
%do i = 1 %to 3;
%put mvar&i = &&mvar&i;
%end;
%mend example;
%example;
或者,您可以重复扫描值列表,并在循环中多次重新定义相同的宏var:
%let list_of_values = A B C;
%macro example2;
%do i = 1 %to 3;
%let mvar = %scan(&list_of_values, &i, %str( ));
%put mvar = &mvar;
%end;
%mend example2;
%example2;
我明确指出我想使用space作为扫描的唯一列表分隔符 - 否则SAS会使用很多默认分隔符。