我每天使用以下格式命名的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;
答案 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;