Loops 在SAS中使用宏do循环创建数据输出

Loops 在SAS中使用宏do循环创建数据输出,loops,macros,sas,Loops,Macros,Sas,当我在SAS中使用宏do循环时,我正在努力创建输出。在常规数据步骤中,我可以使用变量I和var创建以下数据集,以便在输出窗口中“打印”: data example; do i=1 to 4; var = 2+i; output; run; 这将在输出窗口中创建 Obs i var 1 1 3 2 2 4 3 3 5 4 4 6 现在,我的问题是,我使用的是宏do循环,

当我在SAS中使用宏do循环时,我正在努力创建输出。在常规数据步骤中,我可以使用变量
I
var
创建以下数据集,以便在输出窗口中“打印”:

data example;
    do i=1 to 4;
    var = 2+i;
    output;
run;
这将在输出窗口中创建

Obs    i     var
  1    1       3
  2    2       4
  3    3       5
  4    4       6
现在,我的问题是,我使用的是宏do循环,似乎无法执行与常规数据步骤相同的操作(即无法在输出窗口中显示结果)。我的宏的目标是将“_new”添加到列表中每个变量名(A B C D)的末尾,然后我需要它显示在输出窗口中

%let myvarlist=A B C D;

%macro create_new;
    %let mlength=%countlength(&myvarlist);
    %let suffix=new;

    %do n=1 %to &mlength;
        %let var_n=%qscan(&myvarlist,&n);
        %let my_new_varlist=&var_n._&suffix;
    %end;
%mend;
%create_new
我能做的最有效的事情就是把
%put&my_new_varlist
就在
%end
语句之前,但这会将其放在日志窗口中。我尝试在数据步骤中插入do循环,然后使用proc打印,但没有成功

%countlength
是我用来计算列表中变量数量的宏。其代码为:

%macro countlength(char);
  %local num inputword;

  %let num=1;
  %let inputword=%qscan(&char,&num,%str( ));
      %do %while(&inputword NE);
          %let num=%eval(&num+1);
          %let inputword=%qscan(&char,&num,%str( ));
      %end;
  %eval(&num-1);

%mend;

有全局宏符号表和本地宏符号表,countlength宏程序中生成的&num宏变量是本地宏变量,在countlength完成运行后,它将从本地表中删除,因此&num不能用于调用宏程序(新建)。您的代码可以修改为:

%macro countlength(char);
  %let num=1;
  %let inputword=%qscan(&char,&num,%str( ));
      %do %while(&inputword NE);
          %let num=%eval(&num+1);
          %let inputword=%qscan(&char,&num,%str( ));
      %end;
  %global mlength;    
  %let mlength=%eval(&num-1);

%mend;

%let myvarlist=A B C D;

%macro create_new;
    %countlength(&myvarlist)
    %let suffix=new;
    %do n=1 %to &mlength;
        %let var_n=%qscan(&myvarlist,&n);
        %let my_new_varlist=&var_n._&suffix;
        %put &my_new_varlist;
    %end;
%mend;
%create_new
此外,countw是统计字数的SAS函数。你可以直接使用

%macro create_new;
    %let mlength=%sysfunc(countw(&myvarlist));
    %let suffix=new;

    %do n=1 %to &mlength;
        %let var_n=%qscan(&myvarlist,&n);
        %let my_new_varlist=&var_n._&suffix;
        %put &my_new_varlist;
    %end;
%mend;
%create_new
编辑:如果我正确理解您的问题,可能这是代码

%let myvarlist=A B C D;
%macro create_new;
    %local mlength sufix n;
    %let mlength=%sysfunc(countw(&myvarlist));
    %let suffix=new;
    data want;
    %do n=1 %to &mlength;
        %let var_n=%qscan(&myvarlist,&n);
         my_new_varlist="&var_n._&suffix";
         output;
    %end;
    run;
%mend;
%create_new

我不认为宏语言可以单独用于写入输出窗口,因为这不是它的工作。它的工作(主要)是生成SAS代码。但是,SAS代码可以写入输出窗口。也许:

data _null_ ;
  file print ;
  put "&my_new_varlist" ;
run ;

建议您查看Richard Devenzia的实用程序宏%seplist。这是一种很好的向列表添加前缀/后缀/分隔符的方法

我感谢你的帮助。尽管如此,我还是在寻找有关如何生成输出(在输出窗口中,而不是在日志中)的帮助,该输出将为我提供变量a_new、B_new、C_new、D_new的列表。只需将
%put&my\u new\u varlist并不是我真正想要的:)我认为没有一种方法可以轻松做到这一点。您可以创建一个数据步骤并进行打印。我想知道你到底想做什么。是的,这是一个非常奇怪的要求。为什么不只是填充一个表,然后使用您最喜欢的方法打印到输出屏幕上呢?