2015-02-12 58 views
3

如何打印出一個宏觀變量的數據類型日誌怎麼做我的工作我的宏觀變量的數據類型SAS

%macro mymacro(dt2); 


    %LET c_mth = %SYSFUNC(intnx(month,&dt2.d,-1,e),date9.) ; 
    %put &c_mth; 

%mend; 

mymacro('01sep2014') 

我有使用%分配一堆宏觀變量的讓或進入: 我的問題是我想在日期做一堆布爾條件,但我懷疑我的一些變量是字符串,有些是日期 我已經鑄造了他們在我的代碼,但三重檢查肯定是一種返回日誌到日誌的方法

我想要類似於在R中使用str()或mode()或is.numeric()

回答

8

H,

的SAS的宏語言是怪異。 :)

正如Reeza所說,宏變量沒有類型,它們都是文本。但是,如果使用布爾邏輯(%IF語句),並且兩個操作數都是整數,則宏語言將執行數字比較而不是字符比較。

因此,您可以使用INPUTN()函數將日期字符串轉換爲SAS日期(01年1月以後的天數),然後比較這些日期字符串。下面是一個例子,從代碼跳:從樣品通話

%macro mymacro(dt1,dt2); 
    %local c_mth1 c_mth2 n_mth1 n_mth2; 

    %let c_mth1 = %sysfunc(intnx(month,&dt1.d,-1,e),date9.) ; 
    %let c_mth2 = %sysfunc(intnx(month,&dt2.d,-1,e),date9.) ; 
    %let n_mth1 = %sysfunc(inputn(&c_mth1,date9.)) ; 
    %let n_mth2 = %sysfunc(inputn(&c_mth2,date9.)) ; 

    %put &c_mth1 -- &n_mth1; 
    %put &c_mth2 -- &n_mth2; 

    %if &n_mth1<&n_mth2 %then %put &c_mth1 is before &c_mth2; 
    %else %put &c_mth1 is NOT before &c_mth2; 

%mend; 

登錄:

236 %mymacro('01feb1960','01mar1960') 
31JAN1960 -- 30 
29FEB1960 -- 59 
31JAN1960 is before 29FEB1960 

--Q。

5

宏變量沒有類型,它們都是文本。

您必須確保變量以對程序有意義的方式傳遞並生成有效的SAS代碼。

%let date1=01Jan2014; 
%let date2=31Jan2014; 

data _null_; 

x = "&date1"d > "&date2"d; 
y = "&date2"d > "&date1"d; 
z = "&date2"d-"&date1"d; 

put 'x=' x; 
put 'y=' y; 
put 'z=' z; 

run; 

登錄應顯示: x = 0的 Y = 1個 Z = 30

+0

我該如何比較兩個類似日期的宏變量?即如果一個在另一個之後 – shecode 2015-02-12 02:28:42

+0

這取決於它們的外觀。我會在答案中舉一個例子。 – Reeza 2015-02-12 02:48:40

1

如果您的宏變量解析爲日期文字,您可以使用intck%eval結合來比較它們,例如,

%let mvar1 = '01jan2015'd; 
%let mvar2 = '01feb2015'd; 

/*Prints 1 if mvar2 > mvar1*/ 
%put %eval(%sysfunc(intck(day,&mvar1,&mvar2)) > 0);