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

Macro that loads multiple datasets that updates and change names?

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

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

  1. 您的库命名为 lib_2015lib_2016 等,并遵循 8 个字符的库名要求
  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 的变量中。这显示了每个观察结果的来源,因此您可以根据需要将它们拆分为单独的数据集。