SAS循环遍历范围内的月底
SAS loop through month-ends in range
假设我有一个图书馆 save
,其中包含日常文件 thefile_dly_yyyymmdd
、
例如save.thefile_dly_20150831
, save.thefile_dly_20150901
, ..., save.thefile_dly_20210731
.
我想对这个库中的历史数据进行一些操作,但是我只想提取特定日期之间的文件,并且只想保留每个月最后一个文件对应的文件,例如我想提取save.thefile_dly_20150831
、save.thefile_dly_20150930
、save.thefile_dly_20151031
等
类似于以下内容。
%macro loop_through(start,end);
%do i = &start. %to &end.;
%if %sysunc(exist(SAVE.THEFILE_DLY_&i.)) %then %do;
/* Do some data processing on the file */
%end;
%end;
%mend;
%loop_though(20150831,20210731);
问题在于上述代码将循环遍历 20150831 和 20210731 之间的每个整数,这不是最优的,而且它会处理该月存在的每个文件,而不仅仅是对应于每个月的最后一天。
我该如何调整?任何建议将不胜感激。
要遍历日历间隔,请迭代间隔数。使用 INTNX() 函数计算下一个间隔的日期。使用 INTCK() 函数计算请求的间隔数。
%macro loop_through(start,end);
%local offset ymd dsname ;
%do offset = 0 %to %sysfunc(intck(month,&start,&end));
%let ymd=%sysfunc(intnx(month,&start,&offset,end),yymmddn8.);
%let dsname=SAVE.THEFILE_DLY_&ymd;
%if %sysunc(exist(&dsname)) %then %do;
/* Do some data processing on the file */
%end;
%end;
%mend;
%loop_though('01AUG2015'd,'01JUL2021'd);
如果您确实希望允许宏的用户传入 YYYYMMDD 数字字符串而不是实际的 SAS 日期值,则向您的宏添加一些逻辑以将数字字符串转换为实际日期值。例如:
%let start=%sysfunc(inputn(&start,yymmdd8.));
假设我有一个图书馆 save
,其中包含日常文件 thefile_dly_yyyymmdd
、
例如save.thefile_dly_20150831
, save.thefile_dly_20150901
, ..., save.thefile_dly_20210731
.
我想对这个库中的历史数据进行一些操作,但是我只想提取特定日期之间的文件,并且只想保留每个月最后一个文件对应的文件,例如我想提取save.thefile_dly_20150831
、save.thefile_dly_20150930
、save.thefile_dly_20151031
等
类似于以下内容。
%macro loop_through(start,end);
%do i = &start. %to &end.;
%if %sysunc(exist(SAVE.THEFILE_DLY_&i.)) %then %do;
/* Do some data processing on the file */
%end;
%end;
%mend;
%loop_though(20150831,20210731);
问题在于上述代码将循环遍历 20150831 和 20210731 之间的每个整数,这不是最优的,而且它会处理该月存在的每个文件,而不仅仅是对应于每个月的最后一天。
我该如何调整?任何建议将不胜感激。
要遍历日历间隔,请迭代间隔数。使用 INTNX() 函数计算下一个间隔的日期。使用 INTCK() 函数计算请求的间隔数。
%macro loop_through(start,end);
%local offset ymd dsname ;
%do offset = 0 %to %sysfunc(intck(month,&start,&end));
%let ymd=%sysfunc(intnx(month,&start,&offset,end),yymmddn8.);
%let dsname=SAVE.THEFILE_DLY_&ymd;
%if %sysunc(exist(&dsname)) %then %do;
/* Do some data processing on the file */
%end;
%end;
%mend;
%loop_though('01AUG2015'd,'01JUL2021'd);
如果您确实希望允许宏的用户传入 YYYYMMDD 数字字符串而不是实际的 SAS 日期值,则向您的宏添加一些逻辑以将数字字符串转换为实际日期值。例如:
%let start=%sysfunc(inputn(&start,yymmdd8.));