#sas
#sas
Вопрос:
Я пишу макрофункцию. Некоторые таблицы будут созданы, если будут выполнены определенные критерии. Я хочу добавить все эти таблицы вместе в конце. Есть ли способ, которым я могу позволить функции добавлять только существующую таблицу?
Один из методов, о которых я могу подумать, — позволить системе проверить, существует ли таблица, если да, то добавлять одну за другой. Например:
%if %sysfunc(exist(table1)) %then %do;
data final_table; set table1; run;
%end;
%if %sysfunc(exist(table2)) %then %do;
data final_table; set table2; run;
etc......
это сделает код действительно длинным и неэффективным. Есть ли какой-либо способ решить эту проблему? Спасибо
Ответ №1:
Не ждите конца, чтобы объединить их. Создавайте его по ходу работы.
Вы могли бы использовать PROC APPEND. Если БАЗОВАЯ таблица не существует, она создаст ее. В противном случае наблюдения добавляются.
proc append force base=final_table data=tableamp;i;
run;
Обратите внимание, что для этого потребуется, чтобы наборы данных имели одинаковые столбцы.
Комментарии:
1. Спасибо за ваш ответ! но если таблица amp; i не существует, добавление процедуры по-прежнему не работает.
2. Почему вы пытаетесь добавить таблицу, которую вы не создавали?
Ответ №2:
Используйте соглашение об именовании для своих таблиц и храните их в одном месте. Это было бы так же просто, как использовать согласованный префикс, такой как _TEMP_Table1, _temp_table2 и т.д.
Затем, когда вы добавляете их, просто используйте оператор двоеточия:
data want;
set _temp_table: ;
run;
Будут включены только таблицы, начинающиеся с этого префикса.
Это также упрощает удаление их всех позже для очистки вашего процесса.
Ответ №3:
Я придумал решение. Я публикую здесь на случай, если кто-то хочет знать. Я могу создавать пустые таблицы перед запуском любой из этих таблиц. Когда я добавляю все промежуточные таблицы, если они не существуют, будет добавлена только пустая таблица.
data table1 table2....; stop run; /*create null tables*/
/******/
run the rest of the function
/*****/
data final_table; set table1 table2....; run;
/*it won't affect anything even if one of the table tableamp;i is not created*/
Комментарии:
1. Почему бы просто не использовать подстановочный знак?
set table:;