我如何遍历 _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,');')
%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,');')