我在SAS中使用一个数据库,该数据库每隔一段时间就会更新一次。我希望宏自动加载给定年份的最新数据集。数据集涵盖2015-2018年,每年都有不同的更新版本,以数据集的名称表示,即2015_version9。使用我当前的代码,每次数据集更改其版本和名称时,您都需要手动更新宏。
您可以扫描每个库,找到最大版本号,然后将其保存到一个宏变量字符串中,该字符串可以提供给set
语句。以下是该解决方案的假设:
- 您的库名为
lib_2015
、lib_2016
等,并遵循8个字符的libname要求 - 您的图书馆在2015-2018年是静态的
- 您的数据集命名为
_version1
、_version2
等
下面是我们的操作方法。
%let libraries = "LIB_2015", "LIB_2016", "LIB_2017", "LIB_2018";
proc sql noprint;
select cats(libname, '.', memname)
, input(compress(memname,,'KD'), 8.) as version
into :data separated by ' '
from dictionary.members
where upcase(libname) IN(&libraries.)
AND upcase(memname) LIKE "^_VERSION%" escape '^'
group by libname
having version = max(version)
;
quit;
data want;
set &data. indsname=name;
dsn = name;
run;
此代码执行以下操作:
- 从每个以
_VERSION
开头的库中获取所有数据集名称。like
子句中的^
是我们定义的转义符,这样我们就可以从字面上匹配_
- 从数据集名称中删除所有非数字,并将其转换为版本号
version
。compress()
函数中的KD
选项表示只保留字符串中的数字 - 仅保留
version
为最高值的每个库中的名称 - 将所有数据集名称保存到单个宏变量
&data
&data
将存储一个字符串,其中包含您想要的所有相关数据集,每个库的版本号最高。例如:
%put &data.;
LIB_2015._VERSION9 LIB_2016._VERSION19 LIB_2017._VERSION12 LIB_2018._VERSION8
数据步骤中的indsname
选项将存储每个观测的完整数据集名称。我们将其保存到一个名为dsn
的变量中。这显示了每个观察结果的来源,因此您可以根据需要将它们拆分为单独的数据集。