如何从文件名中获取日期以填充日期列?
我有23个数据文件:
price_20070131
price_20070228
price_20070331
.
.
.
price_20081130
在数据文件price_20070131中,当前看起来像这样:
ID Product
001 A
002 B
003 C
我希望我的输出看起来像这样:
ID Product Date
001 A 31Jan2007
002 B 31Jan2007
003 C 31Jan2007
将对所有23个数据文件重复相同的操作。最终结果将合并所有23个文件,如下所示:
ID Product Date
001 A 31Jan2007
002 B 31Jan2007
003 C 31Jan2007
001 A 28Feb2007
002 B 28Feb2007
003 C 28Feb2007
.
.
.
.
001 A 30Nov2007
002 B 30Nov2007
003 C 30Nov2007
答案 0 :(得分:1)
使用INDSNAME选项添加文件名,然后使用SCAN / SUBSTR()提取日期部分。这将附加所有以price_2007和price_2008开头的数据集,并添加一个日期字段。
data want;
set price_2007: price_2008: indsname=source;
date=input(scan(source, 2, '_'), yymmdd10.);
format date date9.;
run;
编辑:SAS 9.1已有15年的历史,因此您应该进行真正的升级。许可证中包含升级。这意味着您没有数据集列表,也没有使用INDSNAME选项的能力,这意味着您或者需要某种宏解决方案。 4行代码变成47 ...
假设您的数据集被一致命名为PRICE_LAST_DAY_MONTH。
*sample data sets for demonstration;
data price_20080131;
set sashelp.class;
test=1;
run;
data price_20080229;
set sashelp.class;
test=2;
run;
%macro stack_data_add_date(start_date=, end_date=, outData=, debug=);
%*get parameters for looping, primarily the number of intervals;
data _null_;
start_date= input("&start_date", yymmdd10.);
end_date = input("&end_date", yymmdd10.);
n_intervals = intck('month', start_date, end_date);
call symputx('start_date', start_date, 'l');
call symputx('end_date', end_date, 'l');
call symputx('n_intervals', n_intervals, 'l');
run;
%*loop from 0 - starting time to end;
%do i=0 %to &n_intervals;
%*determine end of month date for dataset name;
%let date = %sysfunc(intnx(month, &start_date, &i., e));
%*output statistics for testing;
%if &debug=Y %then %do;
%put &n_intervals;
%put &start_date;
%put &end_date;
%end;
%*create a view with the data and date added in;
data _temp / view=_temp;
set price_%sysfunc(putn(&date, yymmddn8.));
date = &date.;
format date date9.;
run;
%*insert into master table;
proc append base=&outData data=_temp;
run;
%*delete view so it doesn't exist for next loop;
proc datasets lib=work nodetails nolist;
delete _temp / memtype=view;
run;quit;
%end;
%mend;
*test;
%stack_data_add_date(start_date=20080131, end_date=20080229, outData=want, debug=Y);