2015-05-22 60 views
2

我是新進SAS,我在看這段代碼:SAS宏和數組的表名

libname FINAL 'C:\PERM'; 
    %LET PERM_DB = C:\PERM_DB.ACCDB; 
    %LET PASS = 1234; 
    %LET EXTRA1 = _A; 


      %MACRO PERM(tablename); 

      PROC IMPORT OUT= FINAL.&tablename&EXTRA1 DATATABLE= "&tableACCESS&EXTRA1" 
      DBMS=ACCESS REPLACE; 
      DATABASE="&PERM_DB"; 
      DBPWD="&PASS"; SCANMEMO=YES; USEDATE=NO; SCANTIME=YES; RUN; 

      %MEND PERM; 

      %PERM(table1); 
      %PERM(table2); 
      %PERM(table3); 
      %PERM(table4); 
      %PERM(table5); 
      %PERM(table6); 
      %PERM(table7); 
      %PERM(table8); 
      %PERM(table9); 
      %PERM(table10); 

我的想法,而不是重複這麼多次的宏觀,創建一個數組和一個循環叫它。

Data test; 
    array perm{*} table1, table2,table3,table4,table5,table6,table7,table8,table9,table10; 

    max = DIM(perm); 

    DO i=1 to max; 
    %PERM(perm(i)); 
    END; 
run; 

但它不工作, 我得到的日誌中這樣的錯誤:

> > 1  FINAL.perm(1)_A 
> >     - 
> >     22 
> >      -- 
> >      22 
> >      202 ERROR 22-7: Invalid option name 1. 
> 
> > ERROR 22-322: Syntax error, expecting one of the following: ;, DATAFILE, DATATABLE, DBMS, DEBUG, 
>    FILE, OUT, REPLACE, TABLE, _DEBUG_. 
> 
> > ERROR 202-322: The option or parameter is not recognized and will be ignored. 

我與數組中的值1測試它。

任何幫助或建議將是偉大的。

輸出應該是這樣的:

FINAL.table1_A

但我正在逐漸

FINAL.perm(1)_A

謝謝您。

+0

嗨,我不明白爲什麼你有一個'數據測試;'數據集內的proc導入宏的調用......?嘗試刪除該行,然後運行;'在末尾 – Bendy

+0

對不起,我修復了代碼,數據測試是針對數組的。 – souyiro2004

+0

我想幫忙,但我很努力地看到目的是什麼......通過一個數組是一個額外的步驟來實現,難以閱讀,並沒有提供任何性能增益 - 每次調用宏都是更多的線條,但它更清晰地閱讀 – Bendy

回答

1

有幾種方法可以解決這個問題。例如,搜索「數據驅動的編程」。我會展示兩個:我的首選,許多人會建議的那個。

首先,流行的解決方案是做一個宏循環。顯然

%macro perm(tablename); 
    %put &tablename; 
%mend perm; 

%macro import_data(min=1,max=); 
    %do _i = &min. %to &max.; 
    %perm(table&_i.); 
    %end; 
%mend import_data; 

%import_data(min=1,max=10); 

與你的真實%perm不是我的例子之一:正常,我會寫與參數MIN和MAX宏,像這樣。它通過%perm呼叫從&min.&max.循環。

其次,真正的數據驅動我會說在許多情況下是最好的。這假定你有一張桌子,每張桌子上有一行你想要導入 - 儘管你也可以用上面的方法解決這個問題。

假設你有一個excel文件,例如,它有一些你想導入的工作表。您可以使用dictionary.tables獲取這些工作表的列表並自動導入每張工作表。

libname imports excel "c:\temp\test_import.xlsx"; 

proc sql; 
    select cats('%perm(',memname,')') 
    into :calllist separated by ' ' 
    from dictionary.tables 
    where libname='IMPORTS'; 
quit; 

&calllist. 

(假定%perm知道如何使用SHEETNAME導入數據。)如果您是從其他來源進口,您可以訪問類似的元數據 - 無論是通過通過dictionary.tables或地區元像SAS的連接例如在Oracle中。

+0

謝謝Joe,我做的是創建許多%表名(因爲沒有特定的名稱順序,我做了%let table1 = names;%let table2 = address;%let table3 = ....等等,然後創建一個%do i = 1%(表的數量)%process(&&表&i.);%end;這通過所有變量我想用一行代碼謝謝你 – souyiro2004