Это была бы идеальная работа для SAS/Macro, которая позволяет замену текста на повторный код. См. Ниже решение (при условии, что диапазон дат 1991-2011 годов изменит операторы %let
в соответствии с вашим диапазоном), с контуром макроса %do
, который заменяет значение & dt. (1991-2011) в код, указанный в вашем вопросе.
%macro date_export;
%let start_date = 1991;
%let end_date = 2011;
%do dt=&start_date %to &end_date;
proc export
data=ds (where=(year=&dt.)) outfile="ds&dt..csv" DBMS=CSV replace;
run;
%end;
%mend date_export;
%date_export
Макро
date_export
макрокоманда определена между операторами %macro
и %mend
. Во-первых, диапазон дат определяется как две макропеременные (это можно опустить, а переменные подключаются прямо к оператору %do
, но здесь для ясности указано). Оператор %do
запускает цикл с переменной макросом dt
в диапазоне от start_date
и end_date
. Это может быть переписано в виде:
%do dt=1991 %to 2011;
и первых двух %let
заявлений опущенных.
Цикл проходит весь код между %do
и %end
, заменяя значения dt
, когда он находит &dt.
.
Экспорт код
Есть несколько тонких изменений, необходимых для правильного обеспечения proc export
пробегов внутри макроса цикла,
Во-первых и наиболее очевидно, я подставил год для &dt.
, который проходит значение dt
в ваш код.
Обратите внимание, что при размещении рядом с .csv
требуется дополнительный период (первый период решает с dt
, оставляя только один период и csv
позади).
Одиночные кавычки из вашего вопроса необходимо заменить двойными кавычками, чтобы макрос разрешился. В противном случае результирующий файл будет называться буквально «ds & dt..csv».
Вы можете включить следующие параметры в SAS, чтобы помочь с макро отладки и визуализации, проверьте документацию SAS для получения дополнительной информации:
SYMBOLGEN
MLOGIC
MPRINT
Следует также отметить, что для больших наборов данных этот подход намного эффективнее, чем версия макроса, поскольку он должен только один раз считывать набор данных ввода (в отличие от одного раза в год). –
'put _all_;' также работает. – Joe
'put _all_;' приводит к именованному результату (например, «год = 2010») и включает в себя значение fv на выходе, а также другие автоматические переменные '_N_' и' _ERROR_'. Он также не выводит разделители. Способ избежать этого - использовать: 'put (_all_) (:);'. Здесь SAS будет печатать только значения переменных и не будет включать автоматические переменные. Я отредактировал ответ, чтобы отразить это более чистое решение. – DWal