加载多个更新和更改名称的数据集的宏



我在SAS中使用一个数据库,该数据库每隔一段时间就会更新一次。我希望宏自动加载给定年份的最新数据集。数据集涵盖2015-2018年,每年都有不同的更新版本,以数据集的名称表示,即2015_version9。使用我当前的代码,每次数据集更改其版本和名称时,您都需要手动更新宏。

您可以扫描每个库,找到最大版本号,然后将其保存到一个宏变量字符串中,该字符串可以提供给set语句。以下是该解决方案的假设:

  1. 您的库名为lib_2015lib_2016等,并遵循8个字符的libname要求
  2. 您的图书馆在2015-2018年是静态的
  3. 您的数据集命名为_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子句中的^是我们定义的转义符,这样我们就可以从字面上匹配_
  • 从数据集名称中删除所有非数字,并将其转换为版本号versioncompress()函数中的KD选项表示只保留字符串中的数字
  • 仅保留version为最高值的每个库中的名称
  • 将所有数据集名称保存到单个宏变量&data

&data将存储一个字符串,其中包含您想要的所有相关数据集,每个库的版本号最高。例如:

%put &data.;
LIB_2015._VERSION9 LIB_2016._VERSION19 LIB_2017._VERSION12 LIB_2018._VERSION8

数据步骤中的indsname选项将存储每个观测的完整数据集名称。我们将其保存到一个名为dsn的变量中。这显示了每个观察结果的来源,因此您可以根据需要将它们拆分为单独的数据集。

最新更新