SAS如何实现仅追加存在的符合命名规则的月度数据集
解决方案
核心修改逻辑是在循环拼接数据集名称时,增加存在性校验,仅将真实存在的数据集加入拼接列表,同时补充空列表异常处理,避免执行空的SET语句报错。
调整后的完整代码
%let currentmonth = &anomes_scores; %let previousyearmonth = &anomes_x12; data _null_; length string $1000; cur_month = input("&previousyearmonth.01",yymmdd8.); do until (cur_month > input("¤tmonth.01",yymmdd8.)); /* 生成当前循环对应的数据集名 */ ds_name = cats('TEMPCAAD.LIFT_&NOME_MODELO._&VERSAO_MODELO._',put(cur_month,yymmn6.)); /* 校验数据集是否真实存在,存在才加入拼接列表 */ if exist(ds_name, 'DATA') then do; string = catx(' ',trim(string), ds_name); end; cur_month = intnx('month',cur_month,1,'b'); end; call symput('mydatasets',trim(string)); run; /* 宏变量输出放到data步外,避免提前解析报错 */ %put 待合并的有效数据集列表:&mydatasets; /* 只有存在有效数据集时才执行合并操作 */ %if &mydatasets. ne %then %do; data WORK.LIFTS_U6M; set &mydatasets.; run; %end; %else %do; %put 警告:指定时间区间内无有效数据集,未执行合并操作; %end;
修改说明
- 新增
exist()函数校验:EXIST是SAS内置函数,第一个参数传入待校验的数据集完整名称,第二个参数指定校验类型为DATA(数据集),返回1表示存在,0表示不存在 - 修复原代码
%put位置错误:原代码将%put写在DATA步内部,宏语句会优先于DATA步执行,此时mydatasets宏变量还未生成,会触发未解析警告 - 新增空列表判断:如果指定时间区间内没有任何符合要求的数据集,会直接输出警告日志,不会执行空的SET语句触发报错
内容的提问来源于stack exchange,提问作者mafalda
相关产品推荐
相关产品推荐

