我需要分解这个SAS宏,它将一些变量的后缀添加到伪代码中,但是有些部分我还不完全理解。
%macro add_suffix(lib,dsn, suffix);
options pageno=1 nodate;
OPTIONS OBS= 1;
DATA GRIDWORK.TMP;
SET &lib..&dsn.;
RUN;
proc sql noprint;
select nvar into :num_vars
from dictionary.tables
where libname="GRIDWORK" and
memname="TMP";
select distinct(name) into :var1-
:var%TRIM(%LEFT(&num_vars))
from dictionary.columns
where libname="GRIDWORK" and
memname="TMP";
quit;
run;
OPTIONS OBS= MAX;
proc datasets library=&LIB;
modify &DSN;
rename
%do i=1 %to &num_vars;
&&var&i=&&var&i..&suffix
%end;
;
quit;
run;
proc datasets library=&LIB;
modify &DSN;
rename pers_gen_key&suffix = pers_gen_key;
quit;
run;
proc sql;
drop table gridwork.tmp;
quit;
%mend add_suffix;
1)在这部分代码中:
DATA GRIDWORK.TMP;
SET &lib..&dsn.;
RUN;
如何设置数据集等于两个值?是否将GRIDWORK.TMP设置为& lib和& dsn的串联?多个时期到底意味着什么呢?
2)据我所知,本节将变量存储在数组中:
proc sql noprint;
select nvar into :num_vars
from dictionary.tables
where libname="GRIDWORK" and
memname="TMP";
select distinct(name) into :var1-
:var%TRIM(%LEFT(&num_vars))
from dictionary.columns
where libname="GRIDWORK" and
memname="TMP";
quit;
dictionary.tables和dictionary.columns的确如何工作,以及它们在这种情况下如何区别? Here是文档,我通读了它,但仍然无法理解代码的这一部分到底发生了什么。
3)接近宏的末尾我们有:
OPTIONS OBS= MAX;
proc datasets library=&LIB;
modify &DSN;
rename
%do i=1 %to &num_vars;
&&var&i=&&var&i..&suffix
%end;
;
quit;
run;
Here是proc数据集过程的文档。它说它命名程序处理的库。这是否意味着& dsn是& lib库的一部分?我想我不确定库在SAS中是如何工作的。它们是内置的还是用户定义的?为什么它们是必要的,我们不能单独修改和DSN吗?
答案 0 :(得分:0)
SAS有两个级别引用,库名称和数据集名称。第一个宏变量指向库,第二个宏指向数据集名称。句点告诉宏处理器宏变量的结束位置,第二个句点用于将libname与数据集名称分开。
它不存储在数组中,它创建宏变量。 Dictionary表是关于表的元数据。我建议实际看看它们。表之间的区别在于TABLES有关于数据集的信息,COLUMNS有关于每个表中变量的信息。
库只是存储SAS数据集的目录/文件夹。这允许SAS引用不同的目录来保存文件,并允许用户在其数据上实现组织系统。 & dsn是& lib文件夹中的数据集。
我强烈建议您查看%put
语句并将其放在代码的各个部分,以确切了解代码的作用。