Использование оператора 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 продолжал функционировать.

Другие вопросы по тегам