如何使用SAS中数据文件名中的日期创建日期字段?

时间:2018-07-26 15:06:56

标签: loops date macros sas append

如何从文件名中获取日期以填充日期列?

我有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

1 个答案:

答案 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);