加载多个更新和更改名称的数据集的宏?
Macro that loads multiple datasets that updates and change names?
我在 SAS 中使用一个经常更新的数据库。我希望宏自动加载给定年份的最新数据集。数据集涵盖 2015-2018 年,每年都有不同的更新版本,以数据集名称表示,即 2015_version9。使用我当前的代码,每次数据集更改其版本和名称时,您都需要手动更新宏。
您可以扫描每个库并找到最大版本号,然后将它们保存到一个宏变量字符串中,您可以将其提供给 set
语句。以下是此解决方案的假设:
- 您的库命名为
lib_2015
、lib_2016
等,并遵循 8 个字符的库名要求
- 您的图书馆在 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
的变量中。这显示了每个观察结果的来源,因此您可以根据需要将它们拆分为单独的数据集。
我在 SAS 中使用一个经常更新的数据库。我希望宏自动加载给定年份的最新数据集。数据集涵盖 2015-2018 年,每年都有不同的更新版本,以数据集名称表示,即 2015_version9。使用我当前的代码,每次数据集更改其版本和名称时,您都需要手动更新宏。
您可以扫描每个库并找到最大版本号,然后将它们保存到一个宏变量字符串中,您可以将其提供给 set
语句。以下是此解决方案的假设:
- 您的库命名为
lib_2015
、lib_2016
等,并遵循 8 个字符的库名要求 - 您的图书馆在 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
的变量中。这显示了每个观察结果的来源,因此您可以根据需要将它们拆分为单独的数据集。