Sas 使用宏进行排序

Sas 使用宏进行排序,sas,Sas,我创建了40多个表(使用一个marco,我刚刚学会了如何做),我希望将Proc Sort语句应用于这些表。我希望每个表按相同的变量“Account\u Description”(每个表都包含此变量)排序 表名为June_53410_v1、June_53420_v1、June_53430_v1等。我可以使用宏吗?如果可以,我如何减少为每个表编写proc sort语句的工作量 谢谢 我在网上找到了这个示例代码,但我不确定它是如何工作的 %Macro sorter(dsn, var); proc

我创建了40多个表(使用一个marco,我刚刚学会了如何做),我希望将Proc Sort语句应用于这些表。我希望每个表按相同的变量“Account\u Description”(每个表都包含此变量)排序

表名为June_53410_v1、June_53420_v1、June_53430_v1等。我可以使用宏吗?如果可以,我如何减少为每个表编写proc sort语句的工作量

谢谢

我在网上找到了这个示例代码,但我不确定它是如何工作的

 %Macro sorter(dsn, var);
 proc sort data=&dsn.;
 by &var.;
 run;
 %mend;
 %sorter(sample_dataset, age);
将使用的宏(proc sort write to work):

获取名称中包含一些字符的表的字典(其名称可能是“June_”,而不是“AIR”):

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

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

我感谢大家的投入——我想我通过使用以下代码找到了答案:

 %macro st (ds);
 proc sort data = &ds;
 by Account_Description;
 run;
 %mend;

 %st(June_53410_v1); 
 %st(June_53420_v1); 

您可以使用此解决方案,其中lib是libname,mask_table是mask to table(任务中的June_),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);

@谢谢!当我运行第二步时,日志显示SASHELP.VTABLE中有0个观测值,我是否应该将所有表(June_53410_v1、June_53420_v1、June_53430_v…)放在SET语句中?Raven Dataset VTABLE保留所有表的所有元信息。根据条件,您只选择需要的表。你纠正LIBNAME了吗?@Raven是的!将我的条件替换为
,其中MEMNAME包含“June_2;”。您将看到表,其中包含根据条件获取的表的元信息(名称、库…);设置sashelp.vtable;其中MEMNAME包含“June_u2;”;跑@Raven在单独的Libname中创建表?我正在读这篇文章,并且真的认为无论您在做什么,都不应该使用宏,而应该由组处理使用。你知道你可以有多个BY变量吗?不管是哪种方式,这里都有一个关于将工作程序更改为宏以及如何为所有值运行它的教程,用这种方式创建宏是非常防错误的。人们可能会猜测表结构相同或高度相似,在这种情况下,一个非常有效的方案是将所有数据堆叠在一个数据集中,并添加一个或多个列,以将“数据”月份名称编号版本迁移到单个表中。此时,您可以利用SAS功能,例如通过
,其中
在一个步骤中执行大量分组处理,或在选定的一组“表”上执行分组处理。这是一次性任务吗?为什么不复制PROC排序步骤40次并更改数据集名称?或者,如果要再次运行原始宏,只需在原始宏中添加代码,使其以正确的排序顺序生成数据集。请检查,正确的答案是,这比只编写PROC SORT语句容易吗?我不必为我的每个表都编写PROC SORT语句。您的编辑器不支持复制和粘贴?无论哪种方式,新键入的数量都是相同的。确实如此,我只是在寻找一种更高效、更干净的方法来编写代码,这就是上面提到的。我没有每次复制和粘贴过程排序步骤,而是键入%st(table_name1);%st(表2);等等
 %macro st (ds);
 proc sort data = &ds;
 by Account_Description;
 run;
 %mend;

 %st(June_53410_v1); 
 %st(June_53420_v1); 
 %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);