簡體   English   中英

將名稱列表讀取到SAS宏

[英]Reading a list of name to a SAS Macro

我正在嘗試將值列表讀入宏,以便宏變量將包含表名並創建一個包含表名的列。

我的嘗試是錯誤的,它試圖使用下面的代碼,並且由於“'&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);

由於您基本上是在處理列表,因此也可以使用調用執行來完成。 無需將所有信息寫入宏變量。 所有表/庫已經存儲在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;

用雙引號引起的宏只能用雙引號引起來,而不是單引號。 如果要執行更有效的方法,可以使用以下修改的代碼來執行。 我假設您正在從名為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保存&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逐個讀取每個值,直到列表的最后。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM