2013-03-12 18 views
3

我是SAS的新手,很難確定何時應該使用簡單的If-Then-else和何時應該使用%IF-%THEN-%ELSE。作爲示例代碼如下:什麼時候在SAS中使用IF或%IF

%let inFile = %scan(&sysparm, 1, " "); 
%macro read_data(infile); 
data want; 
infile "&infile" LRECL=1000; 
retain fdate; 
if _n_ = 1 then do; 
    input Agency $ Status $ Num $ fdate sdate; 
end; 
else do; 
    %if fdate < 20130428 %then 
    input 
    @1 poolno     $6. 
    @7 factor     9.8 @; 
    %else 
    input 
    @1 rectype     $1 
    @3 poolno     $6. 
    @9 factor     9.8 @; 

    @18 pfactor     9.8; 
output; 
end; 
drop Agency Status Num sdate; 
run; 
proc print data=want; 
run; 
%mend read_data; 
%read_data(&inFile); 

我想獲得第一行(頭)並採取參數fdate。根據此參數的值,我以不同方式解析後續輸入行。 但是這似乎不起作用,因爲只有第二個輸入部分運行(總是在輸出中獲取參數'rectype')。

任何建議,因爲我可能做錯了?

回答

0

在上面的示例中,%IF條件基於datastep變量/值。這應該表明它可以使用datasp'if'而不是%IF來實現。

您已經收到一個答案在你前面的問題,https://stackoverflow.com/a/15341502/108797

0

如果你%if fdate < 20130428 SAS比較文字fdate20130428不 值OD fdate20130428

如果你有一個名爲fdate的宏變量,你應該做%if &fdate < 20130428

在你的情況fdate是數據集中的一個變量,所以使用if%if,但好像你正試圖創建一個宏觀數據步驟,只是用if可能不會在這種情況下工作(取決於你想得到什麼)。

2

我看到你有C++作爲你的標籤之一,而你剛剛開始使用SAS。所以我會嘗試提供一個特定於你的背景的答案。

瞭解SAS宏命令和數據的步驟或幾個特效名稱相同的命令之間的區別,就像%,如果如果最簡單的方法,就是認爲SAS宏命令的作爲相當於C/C++預處理器(CPP)指令。 CPP和SAS MAcro都是宏語言,儘管它們不是完全相同的語言,但它們共享兩個重要且最初令人混淆的特徵:它們是文本處理器;並且在主代碼被處理之前它們作爲單獨的步驟被執行。

有些地方可能會出現這種近似情況,但是作爲一個以C/C++爲背景的SAS初學者,這是一個很好的開始。

1

宏語句%if在任何數據步語句之前編譯。這意味着您通常無法在邏輯表達式中使用數據步驟變量。當宏處理器正在編譯宏語句時,數據階躍變量還不存在。

相關問題