2015-08-26 2 views
1

В настоящее время у меня есть процесс SAS, который генерирует множество наборов данных (независимо от того, имеют ли они наблюдения или нет). Я хочу определить способ управления процедурой экспорта, основанный на общем количестве наблюдений (если nobs> 0, затем экспорт). Моя первая попытка была что-то первобытное, используя, если/то логика сравнения в select into макро вар (считая набл в наборе данных) -Управление экспортом (ODS или PROC) на основе количества наблюдений

DATA _NULL_; 
    SET A_EXISTS_ON_B; 
    IF &A_E > 0 THEN DO; 
     FILE "C:\Users\ME\Desktop\WORKLIST_T &PDAY..xls"; 
     PUT TASK; 
    END; 
RUN; 

Проблема здесь в том, что я не есть способ, чтобы написать несколько наборов к такая же книга с несколькими листами (или я?)

Кроме того, всякий раз, когда я пытаюсь добавить еще один блок «Do», с аналогичной логикой выполнение не выполняется. Если это невозможно сделать с данными null, будет ли ODS ответом?

+0

Большая проблема заключается в том, что вы не можете точно написать XLS прямо так: – Joe

+0

, похоже, работал (создайте фактический файл 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

+0

Это не создает фактический файл excel, это точно. Это может создать что-то, что excel желает рассматривать как файл excel, но это не тот. SAS Data Step может создавать только текстовые файлы (т. Е. Плоский файл, с разделителями-запятыми и т. Д.). XLS - это двоичный формат (до самого позднего времени, когда он начинается с openXML, но все же не наивный текст). – Joe

ответ

2

Ядро того, что вы хотите сделать, условно выполнить код, может быть сделано одним из нескольких способов.

Предположим, у нас есть короткий макрос, который экспортирует набор данных в 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 наблюдениями - поэтому он никогда не пытается выполнить экспорт. Это работает с исходным экспортным макросом, а также с измененным.

+0

Это то, что мне нужно! У меня была правильная концепция до части «выбрать в:», чтобы определить количество наблюдений ... просто не знала, как собрать все это вместе! Спасибо за ответ, что еще более важно объяснение ответа ... очень полезно (как вы обычно !!!) +1 – SMW

0

Предлагаем вам Google для разных подходов к написанию файлов XLS.

Что касается использования шага DATA или шага PROC, шаг DATA толерантен к наборам данных, которые имеют 0 общ. Если инструкция SET считывает набор данных, который имеет 0 obs, он просто закончит шаг. Поэтому вам не нужна специальная логика. Большинство PROCS также содержат 0 obs dataset без предупреждения или ошибки.

Например:

1218 *Make a 0 obs dataset; 
1219 data empty; 
1220 x=1; 
1221 stop; 
1222 run; 

NOTE: The data set WORK.EMPTY has 0 observations and 1 variables. 

1223 
1224 data want; 
1225 put "I run before SET statement."; 
1226 set empty; 
1227 put "I do not run after SET statement."; 
1228 run; 

I run before SET statement. 
NOTE: There were 0 observations read from the data set WORK.EMPTY. 
NOTE: The data set WORK.WANT has 0 observations and 1 variables. 

1229 
1230 proc print data=empty; 
1231 run; 

NOTE: No observations in data set WORK.EMPTY. 

Но обратите внимание, как Джо указывает, PROC EXPORT будет счастливо экспортировать набор данных с 0 набл и записи файла с 0 записей, перезапись, если он уже был там. например:

1582 proc export data=sashelp.class outfile="d:\junk\class.xls"; 
1583 run; 

NOTE: File "d:\junk\class.xls" will be created if the export process succeeds. 
NOTE: "CLASS" range/sheet was successfully created. 

1584 
1585 data class; 
1586 stop; 
1587 set sashelp.class; 
1588 run; 

NOTE: The data set WORK.CLASS has 0 observations and 5 variables. 

1589 
1590 *This will replace class.xls"; 
1591 proc export data=class outfile="d:\junk\class.xls" replace; 
1592 run; 

NOTE: "CLASS" range/sheet was successfully created. 

Отчеты по ОРВ, скорее всего, сделают то же самое.

Я использую макрос, чтобы проверить, пуст ли набор данных. SO отвечает: How to detect how many observations in a dataset (or if it is empty), in SAS?

+0

Но что, если вы пытаетесь «proc export» a 0 obs dataset? Это что-то переписывало, нет? – Joe

+0

Да, я думаю, PROC EXPORT вмещает иначе, чем может захотеть OP. :) Я добавлю к ответу. – Quentin

Смежные вопросы