SAS Добавляет наборы данных только в том случае, если они существуют

#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;