SAS экспортирует подмножество столбцов на лист с именем столбца - PullRequest
0 голосов
/ 12 ноября 2018

При наличии набора данных SAS со столбцами с именем n1,n2,..nN.

Существует ли простой способ экспортировать общий набор столбцов и уникальный набор столбцов в рабочую книгу, где каждый столбец экспортируется в рабочий лист с помощьюто же имя, что и имя последнего столбца ?

Пример:

Для указанного выше набора данных SAS столбцы:

  • n1, n2, n5 -> Рабочая таблица n5
  • n1, n2, n9 -> Рабочая таблица n9
  • n1, n2, n13 -> Рабочая таблица n13

экспортируются в рабочую книгу Excel с именами рабочих таблиц, как указано выше.

Цените любые предложения.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Я думаю, что из вашего вопроса я понял, как получить имя листа с последней переменной набора данных SAS.Один из способов сделать это - использовать dictionary.columns и найти, какая позиция столбца (varnum в dictionary.columns) является максимальной в наборе данных, который даст последнюю переменную, и вы можете сделать из этого макропеременную и использовать ее для листа вproc export.

/* 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;
0 голосов
/ 12 ноября 2018

Используйте оператор 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..
...