我如何遍历 _char_ 数据 SAS

How do I loop over _char_ data SAS

%macro var_in_list(z);
proc contents data=&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 &count.;
%put &VarList.;
%let a=;

%let finish=%sysfunc(countw(&VarList));
  %do i = 1 %to &finish;
  %put var_&i= %scan(&varlist., &i, " ");
    %ordinal(var_&i);
  %end;

/*%do j=1 %to &finish;*/
/*  %ordinal(a_:);*/
/*%end;*/

%mend var_in_list;

&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);等等

由于懒惰,我只是想自动化一个简单的过程。

您正在引用一个您从未创建的宏变量。你真的不需要任何宏变量。您可以将扫描结果传递给宏调用。

%do i = 1 %to &finish;
  %ordinal(%scan(&varlist., &i, %str( ) ));
%end;

请注意,您对 %SCAN() 的调用将 space 和双引号都设置为分隔符。它不会有任何影响,除非某些变量名称实际上包含双引号字符。

Tom 回答了如何让您的宏工作,但我会告诉您如何不使用宏。

proc sql noprint;                              
 select Name  into :VarList separated by ' '
 from cont;
quit;

就是这样,你想要的90%?让我们修改一下。

你想要的是 %ordinal( 然后是 name 的值然后是 ),对于每一行,对吗?我们可以cats那个,没问题,就在select!

proc sql noprint;                              
 select cats('%ordinal(',Name,')')  into :OrdCallList separated by ' '
 from cont;
quit;

现在您只需拨打:

&ordcalllist.

直接在一行代码中自行完成 - 它会为您调用您的宏。我没有在此处包括 ; 因为它可能不需要 - 宏通常不需要它们 - 但如果出于某种原因你 do 需要它,只需将它添加到最后的 cats - cats('%ordinal(',name,');')