可以选择导出全部、数值、字符格式的变量
可以选择导出至数据集或者宏变量
- %macro GetVarListForTable(SourceTable,TargetTable,OutputVar,VarType,UseLabel);
- /**********************************************************************/
- /* 此宏的作用是得到指定表格的变量列表。其中,SourceTable是原始表格; */
- /* TargetTable是结果表格;VarType是变量类型,=_Numeric_表示数值型, */
- /* =_Character_表示字符型,=_ALL_表示取得全部变量列表,=xx:表示以xx开 */
- /* 头的所有变量,=xx%表示包含xx的所有变量;UseLabel是标记变量,=Yes表 */
- /* 示用标签代替变量名,否则=No。 */
- /* */
- /* 最终得到指定表格的变量列表。 */
- /* */
- /* Created on 2013.2.6 */
- /* Modified on 2013.2.17 */
- /**********************************************************************/
- /* 检查SourceTable的合法性 */
- %if %SYSFUNC(FIND(&SourceTable,.)) NE 0 %then %do;
- %let GVLFT_SourceLibName=%SCAN(&SourceTable,1,.);
- %let GVLFT_SourceDatasetName=%SCAN(&SourceTable,2,.);
- %end;
- %else %do;
- %let GVLFT_SourceLibName=WORK;
- %let GVLFT_SourceDatasetName=&SourceTable;
- %end;
- /* 检查TargetTable的存在性 */
- %if &TargetTable EQ %STR() AND &OutputVar EQ %STR() %then %do;
- %put ERROR: The TargetTable and OutputVar should not be blank simultaneously, please check it again.;
- %goto exit;
- %end;
- %if &TargetTable EQ %STR() %then %let TargetTable=GVLFT_Res;
- /* 检查VarType的非空性 */
- %if &VarType EQ %STR() %then %let VarType=_All_;
- /* 拆分VarType */
- %SeparateString(InputString=&VarType,OutputString=GVLFT_VarType);
- /* 检查UseLabel的合法性 */
- %if &UseLabel EQ %STR() %then %let UseLabel=No;
- %if %UPCASE(&UseLabel) NE YES AND %UPCASE(&UseLabel) NE NO %then %do;
- %put ERROR: The UseLabel should be Yes or No, case insensitive and without quotes.;
- %goto exit;
- %end;
- /* 开始计算 */
- proc contents data=&SourceTable out=GVLFT_Temp noprint;
- run;
- %do GVLFT_i=1 %to &GVLFT_VarType_Num;
- %if %SYSFUNC(FIND(&&GVLFT_VarType_Var&GVLFT_i,%STR(:))) NE 0 %then %do;
- proc sql noprint;
- create table GVLFT_Res_&GVLFT_i as
- select * from GVLFT_Temp
- where UPCASE(libname)=UPCASE("&GVLFT_SourceLibName.") and
- UPCASE(memname)=UPCASE("&GVLFT_SourceDatasetName.") and
- UPCASE(SUBSTR(name,1,%EVAL(%LENGTH(&&GVLFT_VarType_Var&GVLFT_i)-1))) EQ "%UPCASE(%SUBSTR(&&GVLFT_VarType_Var&GVLFT_i,1,%EVAL(%LENGTH(&&GVLFT_VarType_Var&GVLFT_i)-1)))"
- order by VARNUM;
- quit;
- %end;
- %else %if %UPCASE(&&GVLFT_VarType_Var&GVLFT_i) EQ _NUMERIC_ %then %do;
- proc sql noprint;
- create table GVLFT_Res_&GVLFT_i as
- select * from GVLFT_Temp
- where UPCASE(libname)=UPCASE("&GVLFT_SourceLibName.") and
- UPCASE(memname)=UPCASE("&GVLFT_SourceDatasetName.") and
- UPCASE(type)='NUM'
- order by VARNUM;
- quit;
- %end;
- %else %if %UPCASE(&&GVLFT_VarType_Var&GVLFT_i) EQ _CHARACTER_ %then %do;
- proc sql noprint;
- create table GVLFT_Res_&GVLFT_i as
- select * from GVLFT_Temp
- where UPCASE(libname)=UPCASE("&GVLFT_SourceLibName.") and
- UPCASE(memname)=UPCASE("&GVLFT_SourceDatasetName.") and
- UPCASE(type)='CHAR'
- order by VARNUM;
- quit;
- %end;
- %else %if %SYSFUNC(FIND(&&GVLFT_VarType_Var&GVLFT_i,%STR(%%))) NE 0 %then %do;
- proc sql noprint;
- create table GVLFT_Res_&GVLFT_i as
- select * from GVLFT_Temp
- where UPCASE(libname)=UPCASE("&GVLFT_SourceLibName.") and UPCASE(memname)=UPCASE("&GVLFT_SourceDatasetName.") and
- UPCASE(name) like UPCASE("%%Mgr%")
- order by VARNUM;
- quit;
- %end;
- %else %if %UPCASE(&&GVLFT_VarType_Var&GVLFT_i) EQ _ALL_ %then %do;
- proc sql noprint;
- create table GVLFT_Res_&GVLFT_i as
- select * from GVLFT_Temp
- where UPCASE(libname)=UPCASE("&GVLFT_SourceLibName.") and UPCASE(memname)=UPCASE("&GVLFT_SourceDatasetName.")
- order by VARNUM;
- quit;
- %end;
- %else %do;
- proc sql noprint;
- create table GVLFT_Res_&GVLFT_i as
- select * from GVLFT_Temp
- where UPCASE(libname)=UPCASE("&GVLFT_SourceLibName.") and UPCASE(memname)=UPCASE("&GVLFT_SourceDatasetName.") and
- UPCASE(name) EQ %UPCASE("&&GVLFT_VarType_Var&GVLFT_i.")
- order by VARNUM;
- quit;
- %end;
- %end;
- /* 合并上述表格 */
- data &TargetTable;
- set
- %do GVLFT_j=1 %to &GVLFT_VarType_Num;
- GVLFT_Res_&GVLFT_j
- %end;
- ;
- run;
- %if &OutputVar NE %STR() %then %do;
- %global &OutputVar;
- %if %UPCASE(&UseLabel) EQ NO %then %do;
- proc sql noprint;
- select name into :&OutputVar separated by ' '
- from &TargetTable
- order by VARNUM;
- quit;
- %end;
- %else %if %UPCASE(&UseLabel) EQ YES %then %do;
- proc sql noprint;
- select label into :&OutputVar separated by ' '
- from &TargetTable
- order by VARNUM;
- quit;
- %end;
- %end;
- /* 删除不必要的表格 */
- proc datasets lib=work nolist;
- delete GVLFT_:;
- quit;
- %exit:
- %mend;
- %macro Demo();
- %let SourceTable=Zheng.TurnoverRate;
- %let TargetTable=VarList;
- %let OutputVar=VarString;
- %let VarType=_All_; /* =_Numerical_表示数值型,=_Character_表示字符型,=_ALL_表示取得全部变量列表,=xx:表示以xx开头的所有变量,=xx%表示包含xx的所有变量 */
- %let UseLabel=Yes; /* 标记变量,=Yes表示用标签代替变量名,否则=No */
- %GetVarListForTable(&SourceTable,&TargetTable,&OutputVar,&VarType,&UseLabel);
- %put &VarString;
- %mend;



雷达卡




京公网安备 11010802022788号







