2012-07-25 102 views
1

我有一個列表,我試圖導入到不同的數據集中的17個平面文件。所有的文件都有相同的數據步驟,所以我試圖編寫一個do while循環來導入所有文件。SAS宏做循環 - 導入多個平面文件

我一直在試圖從這裏適應一些代碼沒有成功: http://www.sas.com/offices/europe/uk/support/sas-hints-tips/tips-enterprise-csv.html

http://support.sas.com/documentation/cdl/en/mcrolref/61885/HTML/default/viewer.htm#a000543785.htm

我收到說%do statement is not valid in open code錯誤。這裏是我的代碼:

% let path1 = 'c:\path1' 
% let path2 = 'c:\path2' 
... 
% let pathN = 'c:\pathN' 

%let n=1; 

%do %while (&n <= 17); 
%let pathin = &path&n; 

    data retention&n; 
    infile &pathin; 
    <data step--> 
    run; 

%let n=%eval(&n+1); 
%end; 

我測試過的數據步驟do-while循環之外,它使用%let pathin = &path&n代碼工作罰款1個文件在同一時間。該代碼仍然寫入第一個數據集的數據文件;但是,我需要能夠遍歷所有文件,並且無法弄清楚。對不起,如果這是一個新手問題;我剛剛學習SAS。

感謝, -Alex

回答

5

歡迎SAS編程!你得到的錯誤信息是一條線索。 「開放代碼」是指由SAS系統直接執行的語句。 A %do陳述是SAS宏語言的一部分,而不是「正常」SAS。一個%let語句可以在開放代碼中執行,並用於創建一個macro variable(與編譯的宏不同)。

編譯的SAS宏由出現在%macro%mend語句之間的代碼創建。例如,使用您的代碼:

%macro run_me; 
%let n=1; 

%do %while (&n <= 17); 
%let pathin = &path&n; 

    data retention&n; 
    infile &pathin; 
    <data step--> 
    run; 

%let n=%eval(&n+1); 
%end; 
%mend; 

但是,所做的只是定義/編譯宏。要執行它,您必須發出語句%run_me;。請注意,名稱run_me只是我編造的一個名稱。

欲瞭解更多信息,請查閱SAS Macro Reference,特別是介紹性部分。

+0

謝謝!這工作完美 – 2012-07-26 13:34:15

0

要將progma轉換成宏,把你的LET語句聲明宏觀變量進入宏參數:

%macro readfile(n, pathin); 

    data retention&n; 
    infile &pathin; 
    <data step--> 
    run; 

%mend; 

數據步驟重複調用宏。 這裏的數據包含在CARDS聲明中,也可以通過SET聲明從某些表中讀取。 宏調用通過call execute例程來執行。

data _null_; 
length path $200 stmt $250; 
input path; 
stmt = catt('%readfile(', putn(_N_, 3. -L), path, ')'); 
call execute(stmt); 

cards; 
c:\file1.txt 
c:\file2.txt 
c:\file3.txt 
; 
run;