SAS将列的子集导出到具有列名的工作表

时间:2018-11-11 22:09:34

标签: excel sas export

给出一个名为n1,n2,..nN的列的SAS数据集。

是否有一种简单的方法可以将通用的列集和唯一的列子集导出到工作簿,其中每个列都以与 最后一个列名相同的名称导出到工作表中

示例:

对于上面的SAS数据集,列:

  • n1, n2, n5->工作表n5
  • n1, n2, n9->工作表n9
  • n1, n2, n13->工作表n13

被导出到具有上面命名的工作表的Excel工作簿中。

赞赏任何建议。

2 个答案:

答案 0 :(得分:1)

SHEET=步骤中使用Proc EXPORT语句。

例如:

filename myxl 'c:\temp\sandbox.xlsx';

proc export replace file=myxl dbms=excel 
  data=sashelp.class (keep=name)
;
  sheet='Name';
run;

proc export replace file=myxl dbms=excel
  data=sashelp.class (keep=name age weight) 
;
  sheet='Weight';
run;

可以对宏进行编码以生成重复部分

%macro excel_push (file=, data=, always=, each=);
  %local i n var;
  %let n = %sysfunc(countw(&each));
  %do i = 1 %to &n;
    %let var = %scan(&each,&i);

    proc export replace file=&file dbms=excel 
      data=&data(keep=&always &var)      
    ;
      sheet="&var";
    run;

  %end;

%mend;

options mprint;

filename myxl2 'c:\temp\sandbox2.xlsx';

%excel_push (
  file=myxl2,
  data=sashelp.class,
  always=name age sex,
  each=height weight
)

如果打开Excel输出,将其保持打开状态并重新运行代码,尽管有些晦涩,但会出现错误:

ERROR: Error attempting to CREATE a DBMS table. ERROR: Execute: The Microsoft Access database
       engine could not find the object ********. Make sure the object exists and that you spell
       its name and the path name correctly. If ******** is not a local object, check your
       network connection or contact the server administrator..

答案 1 :(得分:0)

我想,我从您的问题中了解的是如何使用SAS数据集的最后一个变量来获取工作表名称。一种方法是使用dictionary.columns并找到数据集中哪个列位置最大(在dictionary.columns中为varnum),该数据集将给出最后一个变量,您可以在其中创建一个宏变量,并将其用于表格中proc导出。

/* pick up the last variable*/
 proc sql ;
select name into :mysheet TRIMMED from dictionary.columns
where libname = "SASHELP"
and memname = "CLASS"
and  varnum = (select max(varnum) from dictionary.columns
             where libname = "SASHELP"
            and memname = "CLASS");

/* use the macrovariable in your sheet statement*/

 PROC EXPORT DATA= Sashelp.Class  /*Sheet 1*/
     outfile= "/folders/myfolders/class.xlsx "
     dbms=xlsx replace;
     sheet="&mysheet";
run;