将SAS宏分解为伪代码

时间:2015-07-10 14:50:55

标签: macros sas data-processing

我需要分解这个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吗?

1 个答案:

答案 0 :(得分:0)

  1. SAS有两个级别引用,库名称和数据集名称。第一个宏变量指向库,第二个宏指向数据集名称。句点告诉宏处理器宏变量的结束位置,第二个句点用于将libname与数据集名称分开。

  2. 它不存储在数组中,它创建宏变量。 Dictionary表是关于表的元数据。我建议实际看看它们。表之间的区别在于TABLES有关于数据集的信息,COLUMNS有关于每个表中变量的信息。

  3. 库只是存储SAS数据集的目录/文件夹。这允许SAS引用不同的目录来保存文件,并允许用户在其数据上实现组织系统。 & dsn是& lib文件夹中的数据集。

  4. 我强烈建议您查看%put语句并将其放在代码的各个部分,以确切了解代码的作用。