SAS DATA步中如何获取当前表名以标记数据来源表?
解决方案
SAS中可以通过SET语句的INDSNAME选项直接获取当前观测所属的数据集名称,无需手动写多分支判断,实现代码如下:
DATA FINAL_TABLE; /* INDSNAME选项会将当前读取的数据集名存入临时变量dsn中 */ SET TBL_202101 - TBL_202109 INDSNAME=dsn; /* 提取数据集名中最后一个下划线后的年月部分,转为数值型存入table_origin */ table_origin = input(scan(dsn, -1, '_'), best32.); RUN;
方案说明
INDSNAME是SAS 9.2及以上版本支持的SET语句选项,赋值的dsn为临时字符变量,值为当前观测所属数据集的完整名称(含库名)- 用
scan(dsn, -1, '_')可以匹配任意库名前缀,直接提取TBL_xxx后缀的年月数字,适配性更高 - 如果需要
table_origin为字符类型,去掉input()转换函数即可
如果使用的是不支持INDSNAME的老版本SAS,可以用IN=逐表标记的方式实现:
DATA FINAL_TABLE; SET TBL_202101 IN=ds202101 TBL_202102 IN=ds202102 TBL_202103 IN=ds202103 TBL_202104 IN=ds202104 TBL_202105 IN=ds202105 TBL_202106 IN=ds202106 TBL_202107 IN=ds202107 TBL_202108 IN=ds202108 TBL_202109 IN=ds202109 ; IF ds202101 THEN table_origin = 202101; ELSE IF ds202102 THEN table_origin = 202102; ELSE IF ds202103 THEN table_origin = 202103; ELSE IF ds202104 THEN table_origin = 202104; ELSE IF ds202105 THEN table_origin = 202105; ELSE IF ds202106 THEN table_origin = 202106; ELSE IF ds202107 THEN table_origin = 202107; ELSE IF ds202108 THEN table_origin = 202108; ELSE IF ds202109 THEN table_origin = 202109; RUN;
该方案兼容性更高,但待拼接表数量较多时编写成本更高。
注意事项
拼接前请确认所有待合并的表字段结构完全一致(字段名、字段类型、长度匹配),避免出现字段截断、自动转缺失值等异常问题。
内容的提问来源于stack exchange,提问作者walves
相关产品推荐
相关产品推荐

