【问题标题】:SAS - Change formats for multiple variables in all datasetsSAS - 更改所有数据集中多个变量的格式
【发布时间】:2014-06-04 21:47:06
【问题描述】:

我正在编写一个 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;

【问题讨论】:

    标签: sas sas-macro


    【解决方案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;
    

    您也可以对信息执行相同的操作。

    希望对您有所帮助。

    【讨论】:

    • Reese 没有错,这可能是做这部分事情的更好方法,但这并不是您问题的真正答案。以后有时间我会详细回答的。
    • 谢谢 Reese,我会查找 sashelp.vcolumn。当然,乔,现在我只专注于更改格式,但是这个宏也需要检查很多其他的东西——从变量中删除特定的字符,检查最小/最大值,检查一个变量是否只有参考文件中提到的值等。试图找出完成所有这些任务的最有效方法。任何帮助都会很棒!
    • Rom,我会计算这些值,然后将它们与表中的值进行比较。理想情况下,我会这样做,以便格式与您的比较数据集的格式相匹配。您可以从 proc 均值和变量列表中获取 min/max/ranges 从 proc freq.
    猜你喜欢
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 2019-03-17
    相关资源
    最近更新 更多