Использование оператора SAS SET с пронумерованными макропеременными
Я пытаюсь создать собственное преобразование в SAS DI Studio, чтобы выполнить сложную обработку, которую я буду часто использовать. Чтобы достичь этого, в качестве первого шага я пытаюсь воспроизвести функциональность простого преобразования APPEND.
Для этого я включил несколько входов (максимум 10) и пытаюсь использовать &_INPUTn
а также &_INPUT_count
Макропеременные, на которые ссылаются здесь. Я хотел бы просто использовать код
data work.APPEND_DATA / view=work.APPEND_DATA;
%let max_input_index = %sysevalf(&_INPUT_count - 1,int);
set &_INPUT0 - &&_INPUT&max_input_index;
keep col1 col2 col3;
run;
Однако я получаю следующую ошибку:
ОШИБКА: отсутствует числовой суффикс в списке нумерованных наборов данных (WORK.SOME_INPUT_TABLE-WORK.ANOTHER_INPUT_TABLE)
потому что макропеременные преобразуются в имена наборов данных, к которым они относятся, чьи имена не соответствуют формату, необходимому для
SET dataset1 - dataset9;
заявление. Как я могу обойти это?
Большая благодарность
2 ответа
Вам нужно создать макрос, который просматривает ваш список и разрешает переменные. Что-то вроде
%macro list_tables(n);
%do i=1 %to &n;
&&_INPUT&i
%end;
%mend;
data work.APPEND_DATA / view=work.APPEND_DATA;
%let max_input_index = %sysevalf(&_INPUT_count - 1,int);
set %list_tables(&max_input_index);
keep col1 col2 col3;
run;
Оператору SET понадобится список фактических имен наборов данных, поскольку они могут не образовывать последовательность числовых суффиксированных имен.
Вы можете использовать макрос%DO, если макрос уже запущен. Убедитесь, что внутри цикла%DO не генерируются точки с запятой.
set
%do i=1 %to &_inputcount ; &&_input&i %end;
;
Но вы также можете использовать шаг данных для объединения имен в одну макропеременную, которую затем можете использовать в операторе SET.
data _null_;
call symputx('_input1',symget('_input'));
length str $500 ;
do i=1 to &_inputcount;
str=catx(' ',str,symget(cats('_input',i)));
end;
call symputx('_input',str);
run;
data .... ;
set &_input ;
...
Дополнительный CALL SYMPUTX() в верхней части шага данных будет обрабатывать случай, когда count равен единице, а SAS создает только _INPUT
макропеременная вместо создания серии макропеременных с числовым суффиксом. Это установит _INPUT1 в значение _INPUT, чтобы цикл DO продолжал функционировать.