Как я могу зацикливаться на _char_ данных SAS

#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,');')