我正在编写一个SAS宏,它正在尝试检查和更改格式,还检查并报告排除项(不应该存在的值),有效值(应该只有XYZ)等所有变量和所有变量库中的数据集。
以下代码仅用于更改格式。
我创建了一个引用文件,它是proc内容的输出和具有每个变量规则的外部文件的组合。所以这个文件有数据集名称,变量名称和所有规则(格式,排除,有效值,最小值,最大值等)
我无法让SAS浏览每个数据集中的每个变量 - 此代码的最后一部分是我遇到的问题。
options mprint;
%macro reformat_var;
data _null_;
set SASDATA.Reference_File;
if Country='USA' then do;
call symput("SASData",SASData_Folder);
call symput("Country_Name",Country);
end;
run;
proc sql noprint;
select Data_Name, /*SAS dataset name */
Var_Name, /* Variable name */
Column_informat, /* current format of the variable in the data */
Column_format /* format I want to change to */
into : Data_List separated by ' ',
: Var_List separated by ' ',
: Informat_List separated by ' ',
: Format_List separated by ' '
from SASDATA.Reference_File;
quit;
proc sql noprint;
select count(filen)
into :cntfile
from sasdata._indexfile;
/*created in a prior step, indexfile has a list of all the SAS dataset names */
%if &cntfile>=1 %then %do;
select filen into :filen1-:filen%left(&cntfile)
from sasdata._indexfile;
%end;
quit;
/* Change date formats - this is where I am getting stuck – how do I check format
for each variable in each dataset using the macro variables (Data_List, Var_List,
Informat_list, Format_List) */
%do i=1 %to &cntfile;
data sasdata.&&filen&i;
set sasdata.&&filen&i;
%if &Country_Name='USA' and &Informat_list='mmddyy10.' %then %do;
format &Var_List &Format_list;
%end;
%end;
run;
%mend reformat_var;
%reformat_var;
答案 0 :(得分:1)
我不建议使用此方法。
相反,请考虑使用SASHELP.VCOLUMN数据集生成变量和格式的列表。然后使用proc数据集应用所需的新格式,这样您就不会读入/读出整个数据集。
通过这种方式,您可以非常轻松地比较这两个文件,因为它们希望具有相同的列/行:)
如果你想以这种方式继续,我建议你改变你的PROC SQL步骤来读取类似
的内容proc sql;
select "format" || var_name || " " || format_name
into :format_list separated by ";"
from SASDATA.Reference_File;
quit;
%put &format_list;
这将生成如下格式语句:
format var1 format1;
format var2 format2;
format var3 format3;
您也可以为信息提供相同的信息。
希望有助于您入门。