#loops #sas #sas-macro
Вопрос:
%macro var_in_list(z);
proc contents data=amp;z. noprint out=cont(keep= name);
run;
proc sql noprint;
select Name into :VarList separated by ' '
from cont;
quit;
proc sql noprint;
select count(*) into :count from cont; quit;
%put amp;count.;
%put amp;VarList.;
%let a=;
%let finish=%sysfunc(countw(amp;VarList));
%do i = 1 %to amp;finish;
%put var_amp;i= %scan(amp;varlist., amp;i, " ");
%ordinal(var_amp;i);
%end;
/*%do j=1 %to amp;finish;*/
/* %ordinal(a_:);*/
/*%end;*/
%mend var_in_list;
amp;varlist.=WOE_ASSET_TYPE WOE_CURRENT_ASSETS WOE_CURRENT_LIABILITIES_1 WOE_DEPRECIATION_1
WOE_DebtAmount WOE_Delta_TL WOE_Delta_TS WOE_Delta_interest WOE_Delta_npbt WOE_Delta_taxes WOE_EBITDA_COVERAGE WOE_EFA
WOE_EPP WOE_IsCodebtor WOE_NACE WOE_OutstandingAmount WOE_PPLTL WOE_PPTA WOE_PRODUCT WOE_P_price WOE_TEENOR WOE_T_L1
WOE_max_LD_1 WOE_max_LD_2 WOE_max_LD_3 WOE_max_LD_4 WOE_max_LD_5 WOE_max_LD_6 WOE_max_LD_7 WOE_max_LD_8 WOE_max_LD_9
WOE_max_LD_10 WOE_max_LD_12 delnum percbad tot
Я хочу:
%порядковый номер(WOE_ASSET_TYPE); %порядковый номер(WOE_CURRENT_ASSETS); и т.д.
Я просто пытаюсь автоматизировать простой процесс из-за лени.
Комментарии:
1. Нет необходимости повторно запускать запрос, чтобы подсчитать, сколько имен вы нашли. SQL установит это в автоматические переменные макросов SQLOBS. Просто используйте
%let finish=amp;sqlobs;
сразу после инструкции select, которая создает переменную макроса со списком имен.
Ответ №1:
Вы ссылаетесь на макропеременную, которую никогда не создавали. На самом деле вам не нужен никакой макрос, который можно изменять. Вы можете просто передать результаты сканирования вызову макрокоманды.
%do i = 1 %to amp;finish;
%ordinal(%scan(amp;varlist., amp;i, %str( ) ));
%end;
Обратите внимание, что при вызове функции %SCAN() в качестве разделителей устанавливаются как пробел, так и двойные кавычки. Это не окажет никакого влияния, если только некоторые имена переменных на самом деле не содержат символы двойных кавычек.
Комментарии:
1. Я бы пошел дальше и исправил ошибку, чтобы удалить кавычки в вашем ответе, так как это, безусловно, более правильно использовать
%scan(amp;varlist., amp;i, %str( ))
и не обязательно очевидно, как получить там это место.
Ответ №2:
Том ответил, как заставить ваш макрос работать, но я расскажу вам, как не использовать макрос.
proc sql noprint;
select Name into :VarList separated by ' '
from cont;
quit;
Это что, 90% того, что ты хочешь? Давайте просто изменим это.
То , что вам нужно %ordinal(
, — это значение для имени, затем )
для каждой строки, верно? Мы можем cats
это, без проблем, прямо в select
!
proc sql noprint;
select cats('%ordinal(',Name,')') into :OrdCallList separated by ' '
from cont;
quit;
Теперь ты просто позвони:
amp;ordcalllist.
Непосредственно в строке кода все само по себе — и он вызовет ваш макрос для вас. Я не включаю ;
сюда, так как это, вероятно, не нужно — макросы обычно не требуют их, — но если по какой-то причине вам это нужно, просто добавьте его cats
в конец — cats('%ordinal(',name,');')