#sas #macros #sas-macro
#САС #макросы #sas-макрос
Вопрос:
У меня есть много наборов данных для каждого месяца с одним и тем же именем, которые меняются только в конце определенного месяца, поэтому, например, мои наборы данных, которые я вызываю с помощью этого кода:
TEMPCAAD.LIFT_amp;NOME_MODELO._amp;VERSAO_MODELO._'!! put(cur_month,yymmn6.));
называются «TEMPCAAD.LIFT_MODEL_V1_202021», «TEMPCAAD.LIFT_MODEL_V1_202022» и так далее…
Я пытаюсь добавить все наборы данных, но некоторые из них не существуют, поэтому, когда я запускаю следующий код, я получаю ошибку
Набор данных «TEMPCAAD.LIFT_MODEL_V1_202022» не существует.
%let currentmonth = amp;anomes_scores; %let previousyearmonth = amp;anomes_x12; data _null_; length string $1000; cur_month = input("amp;previousyearmonth.01",yymmdd8.); do until (cur_month gt; input("amp;currentmonth.01",yymmdd8.)); string = catx(' ',trim(string),'TEMPCAAD.LIFT_amp;NOME_MODELO._amp;VERSAO_MODELO._'!! put(cur_month,yymmn6.)); cur_month = intnx('month',cur_month,1,'b'); end; call symput('mydatasets',trim(string)); %put amp;mydatasets; run; data WORK.LIFTS_U6M; set amp;mydatasets.; run;
Как я могу добавлять только существующие наборы данных?
Ответ №1:
Вместо того, чтобы зацикливаться на каждом файле, чтобы узнать, существует он или нет, почему бы вам просто не извлечь все имена наборов данных из dictionary.tables
?
libname TEMPCAAD "/home/kermit/TEMPCAAD"; data tempcaad.lift_model_v1_202110 tempcaad.lift_model_v1_202111 tempcaad.lift_model_v1_202112; id = 1; output tempcaad.lift_model_v1_202110; id = 2; output tempcaad.lift_model_v1_202111; id = 3; output tempcaad.lift_model_v1_202112; run; %let nome_modelo = MODEL; %let versao_modelo = V1; proc sql; select strip("TEMPCAAD."||memname) into :dataset separated by " " from dictionary.tables where libname="TEMPCAAD" and memname like "LIFT_amp;NOME_MODELO._amp;VERSAO_MODELO.%"; quit; data want; set amp;dataset.; run;
Вы можете легко настроить where statement
, чтобы извлекать только те данные, которые вы хотите добавить. Просто не забудьте поставить двойные кавычки, если вы укажете в нем макропеременную.
Комментарии:
1. это хороший вариант, но он занимает слишком много времени, я думаю, это потому, что у меня тысячи таблиц на TEMPCCAD 🙁
2. Попробуйте воспользоваться СЛОВАРЕМ. Вместо этого ЧЛЕНЫ КЛУБА. Это должно занять меньше времени, так как включает в себя меньше атрибутов.
3. Спасибо!! что делать, если есть одна таблица, которую я не хочу использовать в своих данных; установить amp;набор данных.;запустить; ? я спрашиваю об этом, потому что у меня есть таблица с именем, очень похожим на те, которые я хочу использовать, но те, с похожими именами, которые я не хочу использовать
4. вы можете просто настроить оператор where в процедуре SQL — например, добавить
and memname ne lt;yourtablenamegt;