[英]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;
用雙引號引起的宏只能用雙引號引起來,而不是單引號。 如果要執行更有效的方法,可以使用以下修改的代碼來執行。 我假設您正在從名為flat0113
, flat0213
等的庫中進行讀取。
第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.