2017-10-18 22 views
2

我試圖從記事本(文本)閱讀下面的數據文件轉換爲SAS數據集:數據不正確地讀他爲失蹤人在使用DSD選項INFILE語句(SAS)

name1,124325,08/10/2003,1250.03 
name2,114565,08/11/2003,11115.11 
name3,000007,08/11/2003,12500.02 

當我使用該SAS代碼:

data new; 
filename tfile '~\transact2.txt'; 
infile tfile dsd; 
input name $ id date mmddyy10. cost 8.2; 
run; 

我得到這個,成本是所有丟失:

enter image description here

但是,如果我只是用dlm=','替換dsd,則會正確讀入成本變量。爲什麼dsd會導致成本變量讀取不正確?

回答

2

dsd不說「使用分隔符」。它告訴SAS 如何使用該分隔符(主要是將引號中的任何內容視爲一個字段,並修改連續分隔符的處理方式)。有必要正確讀取這個文件,需要使用dlm=','。我感到有點驚訝,你已經像你一樣接近正確了。 (幸運的是,SAS在這裏做了一些假設,最終使其工作正常,或多或少)。

此外,你混合兩種風格的輸入,這是不允許的。

當您使用分隔輸入時,您正在使用列表而非列輸入。您只能指示字符/不是字符,並且不能直接使用信息。如果你想要像你的日期做嵌入informats,你需要使用修改後的列輸入:

data new; 
filename tfile '~\transact2.txt'; 
infile tfile dsd; 
input name $ id date :mmddyy10. cost; 
run; 

還要注意cost,閱讀與8.2不正確。信息中的小數僅用於在12345678中作爲123456.78(當您有80個列卡並且不希望在小數點上花1)時讀取。一般來說,在「現代」SAS中,你不應該使用信息的小數部分。 SAS會看到小數點,並正確處理。

+0

謝謝,解決了這個問題!我不知道 - 如果mmddyy10。適用於「日期」的格式是問題,那麼爲什麼SAS將「成本」設置爲丟失而不是「日期」?它看起來像「日期」在輸出中確實應用了正確的格式。 – LLP

+1

使用格式化輸入'date mmddyy10.'而不是列表輸入'date:mmddyy10.'時,SAS將精確移動10個字符,並且可以嘗試將分隔符讀入數據或將光標保留在分隔符之前,以便它看起來你有兩個相鄰的分隔符,因此缺少一個值。 – Tom