2012-05-01 229 views
1

我想寫一個SAS腳本,它將簡單讀入SAS .sas7bdat數據文件並以文本格式輸出。我希望日期以YYYYMMDD格式輸出。我不知道日期欄的名稱是什麼。目前我的腳本是:sas日期格式

libname tmplib '~/testdatadir/'; 
OPTIONS MISSING='00'x; 
data tmpdata; 
set tmplib.testdatafile; 
array flds{*} _NUMERIC_; 
do i=1 to dim(flds); 
    if missing(flds(i)) then flds(i)=.; 
end; 
array charflds{*} _CHARACTER_; 
do i=1 to dim(charflds); 
    if missing(charflds(i)) then charflds(i)=' '; 
end; 
drop i; 
RUN; 

PROC EXPORT 
    DATA = tmpdata 
    OUTFILE = 'testdataoutfile.txt' 
    DBMS = TAB REPLACE; 
    PUTNAME = YES; 
RUN; 

我要麼想通過所有日期字段迭代(因爲我NUMERIC領域和CHARACTER領域做的),或者增加一個檢查每個NUMERIC現場測試是否它是一個日期(然後我可以更改格式),或者添加一個選項到PROC EXPORT以指示輸出日期格式。獲取輸出文件的日期格式爲YYYYMMDD的任何其他方法也是可以接受的。

+0

在您的數據中是否有指示變量是日期的內容?它是否已經格式化爲日期?它是否有名稱中的內容表明它是約會? –

回答

5

您可以使用varfmt函數來查找數值變量的格式,它可以幫助您確定它是否爲日期,即它的格式是否爲日期格式。從技術上講,你可能有一個日期不是正確的日期格式,所以它只顯示爲16239或其他東西,但這些很難檢測,因爲它也可能只是數字16,239。此方法將查找在數據瀏覽器中顯示爲日期的任何內容。

然後使用putinput的某種組合將其轉換爲YYYYMMDD格式。

僅僅使用put的一個問題是,我認爲默認情況下它會返回一個字符變量,因此您需要創建一個新的字符變量來保存日期,或者將YYYYMMDD轉換回8位數字編號,所以編號20120501而不是字符串20120501

對於example 2,您應該注意,varfmt返回給定數據集名稱和變量編號的變量格式。在這個例子中,他們建立了一個單獨的vars表,其目的是遍歷所有的變量。

+3

VARFMT函數與SAS組件語言(SCL)一起使用,使語法更復雜。 VFORMAT功能在數據步驟中執行相同的任務,在這裏可能會更容易。但是,檢查返回的格式名稱是多種日期格式之一還是有任務的! – Longfish

3

我建議改變變量格式。當變量格式沒有改變時,使用put/input可能會導致錯誤的結果。例如,如果使用put/input將日期更改爲年,但將變量格式保留爲date9,則日期仍將作爲date9(基礎值爲年)讀取。如果您導出爲CSV,日期將不正確。

這是一個簡單的宏,它將檢查所有變量並隔離日期,以便將其格式修改爲年份。您需要指定哪些日期格式可以在您的數據集中(或創建比宏中的內容更詳盡的列表),並對其進行修改以生成所需的數據格式。

%macro _toyear(dsin=,dsout=); 
/* proc contents will list all variables in the dataset, with formats */ 
proc contents data=&dsin out=_contents noprint; 
    run; 
data _contents; 
    set _contents (where=(format in: ("DATE", "MMDDYY", "MMYY"))); 
    run; 

/* use proc sql to create a macro variable with a list of the date variables */ 
proc sql noprint; 
    selet name into: datevars separated by " " from _contents; 
    quit; 

/* simple error checking, in case there are no date variables */ 
%let dsid = %sysfunc(open(_contents, is)); 
%let nlobs = %sysfunc(attrn(&dsid, nlobs)); 

/* output dataset */ 
data &dsout; 
    set &dsin; 
    %if &nlobs ne 0 %then %do; format &datevars year4.; %end; 
    run; 

/* clean-up */ 
%let rc = %sysfunc(close(&dsid)); 
proc datasets nolist; delete _contents; 
    run; 
%mend _toyear;