使用宏进行程序排序

时间:2019-08-06 13:52:33

标签: sas

我创建了40个以上的表(使用marco,我刚刚学习了如何做),要将Proc Sort语句应用于该表。我希望每个表都按相同的变量“ Account_Description”排序(每个表都包含此变量)。

表名是June_53410_v1,June_53420_v1,June_53430_v1等。我可以使用宏吗?如果可以,我该如何减轻为每个表编写proc排序语句的麻烦?

谢谢!

我在网上找到了此示例代码,但我不确定该如何工作

 %Macro sorter(dsn, var);
 proc sort data=&dsn.;
 by &var.;
 run;
 %mend;
 %sorter(sample_dataset, age);

3 个答案:

答案 0 :(得分:2)

将要使用的宏(进行过程排序写入工作)

%Macro sorter(lib,dsn, var);
proc sort data=&lib..&dsn. out=&dsn.;
by &var.;
run;
%mend;

获取包含一些字符的表的字典(其maby为“ June_”而不是“ AIR”)

data sashelp_tables;
set sashelp.vtable;
where LIBNAME="SASHELP" and MEMNAME contains "AIR"
;
run;

将代码写入字符串,然后对所有表执行该代码:

data _NULL_;
length code $ 200;
set sashelp_tables;
code=cat('%sorter(',LIBNAME,',',MEMNAME,',AIR);');
call execute(code);
run;

答案 1 :(得分:2)

您可以使用以下解决方案,其中lib是libname,mask_table是表的掩码(任务中的Jun_),而var是对表进行排序的变量:

 %macro sorter(lib,mask_table, var); %macro d;%mend d;

       %let table_list = 0;

       proc sql noprint;
          select strip(libname) || '.' || strip(memname),count(memname)
          into: table_list separated by ' '
          from dictionary.tables 
          where libname = UPCASE("&lib.") and memname LIKE UPCASE("&mask_table.")||"%";
       quit;

       %do i=1 %to %sysfunc(countw(&table_list,%str( )));
          %let name&i = %scan(&table_list, &i, %str( ));
          proc sort data=&&name&i.;
             by &var.;
          run;
       %end;

  %mend sorter;
  %sorter(WORK,June,Account_Description);

答案 2 :(得分:1)

我很感谢大家的投入-我认为我使用此代码找到了答案:

.fail
.fail .eda
.eda .fail
.fail
hello world