Ядро того, что вы хотите сделать, условно выполнить код, может быть сделано одним из нескольких способов.
Предположим, у нас есть короткий макрос, который экспортирует набор данных в excel. Просто как пирог.
%macro export_to_excel(data=,file=,sheet=);
proc export data=&data. outfile=&file. dbms=excel replace;
sheet=&sheet.;
run;
%mend export_to_excel;
Теперь предположим, что мы хотим сделать это условно. Как мы это делаем, это в какой-то мере зависит от того, как мы теперь называем этот макрос в нашем коде.
Допустим, у вас есть:
%let wherecondition=1; *always true!;
data class;
set sashelp.class;
if &wherecondition. then output;
run;
%export_to_excel(data=class,file="c:\temp\class.xlsx", sheet=class1);
Теперь вы хотите, чтобы сделать это так, то только экспорт, если класс имеет несколько строк в ней, верно. Таким образом, вы получаете номер обс в классе:
proc sql;
select count(1) into :classobs from class;
quit;
И теперь вам нужно как-то включить это. В этом случае самым простым способом является добавление условия в макрос экспорта. Открытый код не позволяет условно выполнять код, поэтому он должен быть в макросе.
Так мы делаем:
%macro export_to_excel(data=,file=,sheet=,condition=1);
%if &condition. %then %do;
proc export data=&data. outfile=&file. dbms=excel replace;
sheet=&sheet.;
run;
%end;
%mend export_to_excel;
И добавить счетчик на вызов:
%export_to_excel(data=class,file="c:\temp\class.xlsx", sheet=class1,condition=&classobs.)
Тада, теперь он не будет пытаться экспортировать, когда это 0. Великий.
Если этот код уже в макрос, вы не должны изменять сам экспортный макрос. Вы можете просто положить эту часть %if %then
вокруг макроса позвонить. Но это только, если все это уже макрос - %if
не допускается за пределами макросов (извините).
Теперь, если вы экспорт целой кучи наборов данных, и вы генерируете свои экспортные вызовы от чего-то, вы можете добавить условие там, более легко и плавно, чем это.
В принципе, либо сделать вручную (если это имеет смысл), или использовать proc sql
или proc contents
или (другой метод по вашему выбору), чтобы сделать набор данных, который содержит одну строку для каждого набора данных к экспорту, с четырьмя переменными: набор данных имя, файл для экспорта, лист для экспорта (если это не совпадает с именем набора данных) и количество наблюдений для этого набора данных. Часто первые три будут сделаны вручную, а затем объединены/обновлены через sql или что-то еще на счет obs в наборе данных.
Затем вы можете генерировать звонки экспортировать, например, так:
proc sql;
select cats('%export_to_excel(data=',dataname,',file=',filename,',sheet=',sheetname,')')
into :explist separated by ' '
from datasetwithnames
where obsnum>0;
quit;
&explist.; *this actually executes them;
Предполагая obsnum это новая переменная, которую создали с # набл, а остальные переменные явно названы. Это не будет тянуть линию с чем-либо с 0 наблюдениями - поэтому он никогда не пытается выполнить экспорт. Это работает с исходным экспортным макросом, а также с измененным.
Большая проблема заключается в том, что вы не можете точно написать XLS прямо так: – Joe
, похоже, работал (создайте фактический файл excel) ..... ПРИМЕЧАНИЕ: 3 записи были записаны в файл «C: \ Users \ пловец \ Рабочий стол \ WORKLIST_T 2015-08-25.xls ". Минимальная длина записи была 1. Максимальная длина записи была 1. ПРИМЕЧАНИЕ. Наблюдалось 3 наблюдения из набора данных WORK.FD_EXISTS_ON_PA. ПРИМЕЧАНИЕ: Используемая инструкция DATA (общее время процесса): в реальном времени 0,03 секунды cpu time 0,03 секунды – SMW
Это не создает фактический файл excel, это точно. Это может создать что-то, что excel желает рассматривать как файл excel, но это не тот. SAS Data Step может создавать только текстовые файлы (т. Е. Плоский файл, с разделителями-запятыми и т. Д.). XLS - это двоичный формат (до самого позднего времени, когда он начинается с openXML, но все же не наивный текст). – Joe