【问题标题】:Reading a list of name to a SAS Macro将名称列表读取到 SAS 宏
【发布时间】:2016-03-10 21:33:07
【问题描述】:

我正在尝试将值列表读入宏,以便宏变量包含表名并创建包含表名的列。

我的尝试是错误的,它试图使用下面的代码,但由于“ '&tbl' as Table_Dt ”这一行而出错。下面的代码效率低下,因此请随时对其进行增强。感谢您的帮助。

%macro flat(tbl);
proc sql exec feedback stimer noprint outobs=5;
CREATE TABLE &tbl as
   SELECT 
            ID,
            DOB, 
            '&tbl' as Table_Dt
      FROM &tbl..flat_file;
QUIT;
%mend flat;
%flat(flat0113);
%flat(flat0213);
...
%flat(flat1213);

【问题讨论】:

    标签: list macros sas


    【解决方案1】:

    由于您基本上是在处理一个列表,这也可以使用调用执行来完成。无需将所有信息写入宏变量。所有表/库都已存储在 sashelp 表中,因此可以进行列表处理。

    data _null_;
        set sashelp.vslib (where=(substr(libname,1,4) = 'FLAT'))  end =eof;
        if _n_ = 1 then call execute ('proc sql exec feedback stimer noprint outobs=5;');
        call execute ('
            CREATE TABLE '|| libname ||' AS
                SELECT  ID,
                        DOB,
                        "'||compress(libname)||'" as Table_Dt
                            FROM '||compress(libname)||'.flat_file
                        ;
                    ');
        if eof then call execute ('QUIT;');
    run;
    

    【讨论】:

    • 我比我的回答更喜欢这个。 call execute 是那些很少使用的功能之一,可以让事情变得非常方便。
    【解决方案2】:

    引号中的宏只能用双引号解析,而不是单引号。如果你想做一个更有效的方法,你可以用下面的修改代码来做到这一点。我假设您正在阅读名为 flat0113flat0213 等的库。

    第 1 步:获取所有包含“flat”字样的 libname 的列表

    proc sql noprint;
        select distinct libname
             , count(libname)
        into: tbl_list separated by ' '
            , total_tbls
        from sashelp.vmember
        where libname LIKE 'FLAT%'
        ;
    quit;
    

    这将创建两个宏变量:&tbl_list&total_tbls

    &tbl_list 保存值flat0113 flat0213 flat ... flat1213

    &total_tbls 保存&tbl_list 中值的总数。

    第 2 步:循环遍历新创建的列表

    %macro readTables;
        %do i = 1 %to &total_tbls;
    
            %let tbl = %scan(tbl_list, &i);
    
            proc sql exec feedback stimer noprint outobs=5;
                CREATE TABLE &tbl as
                   SELECT 
                         ID,
                         DOB, 
                        "&tbl" as Table_Dt
                   FROM &tbl..flat_file;
            quit;
        %end;
    
    %mend;
    %readTables;
    

    这将从&tbl_list 中一个一个地读取每个单独的值,直到列表的最后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      • 2020-02-08
      • 2014-06-14
      相关资源
      最近更新 更多