如何编写宏代码来输入每日SAS数据集以将它们附加到年度数据集中?

时间:2014-09-13 22:53:27

标签: macros sas

我每天使用以下格式命名的SAS数据集,例如01/01/2012和01/02/2012:

daily_01jan12和daily_02jan12

我必须将所有这些数据集附加到年度数据集中。 在SAS中使用宏编写此代码的有效方法是什么?

我现在所拥有的是下面的内容。但是,我需要做365次,我相信一定有更好的方法。

非常感谢任何帮助。谢谢。

data libw.daily01Jan2012;
set libw.daily_01Jan2012;
Day=1;
Month=1;
Year=2012;

data libw.daily02Jan2012;
set libw.daily_02Jan2012;
Day=2;
Month=1;
Year=2012;

proc append base=libw.daily01Jan2012 data=libw.daily02Jan2012;
run;

2 个答案:

答案 0 :(得分:2)

如果您不关心数据集的顺序,并且库中只包含您要附加​​的数据集,那么您可以执行以下操作:

data want(drop=dt);
    set libw.daily_: indsname=ds_name open=defer;

    dt = input(scan(ds_name, 2, "_"), date9.);
    day = day(dt);
    month = month(dt);
    year = year(dt);
run;

如果您需要先对数据集进行排序或过滤,可以使用proc sql创建一个包含所有数据集名称的宏变量。

proc sql noprint;
    select distinct catx('.', libname, memname) into :ds_list separated by ' '
    from sashelp.vcolumn
    where
        memtype = 'DATA' and
        libname = 'LIBW' and
        memname like 'DAILY^_%' escape '^' and 
        input("01JAN2012", date9.) le input(scan(memname, 2, "_"), date9.) lt input("01JAN2013", date9.)
    order by input(scan(memname, 2, "_"), date9.);
quit;

data want(drop=dt);
    set &ds_list indsname=ds_name open=defer;

    dt = input(scan(ds_name, 2, "_"), date9.);
    day = day(dt);
    month = month(dt);
    year = year(dt);
run;

答案 1 :(得分:1)

如果所有数据集都在一个库中,并且它们是文件夹中的唯一数据集,则可以执行以下操作。

每日结束后的冒号告诉SAS包含所有以每日开头的文件。

indsname选项允许您存储文件名,然后您可以提取名称的日期部分。

如果您需要获取日,月,年,您还可以提取具有相关功能的那些,但通常只需要一个日期变量。 未测试的:

data annual;
    set libw.daily: indsname=source;
    date=input(substr(source, 10, 9), date9.);
run;