2013-02-16 31 views
1

我有一個blood.txt數據集這樣的(第5個OBS):SAS問題 - 無法讀取該數據集的數字列

1 Female AB Young 7710 7.4 258 
2 Male AB Old 6560 4.7 . 
3 Male A Young 5690 7.53 184 
4 Male B Old 6680 6.85 . 
5 Male A Young .  7.72 187 

我用下面的程序來閱讀:

data blood_sum; 
infile "/path/blood.txt"; 
input @1 SubjID $ 
     @6 Gender $ 
     @13 BloodType $ 
     @16 AgeGrp $ 
     @22 RBC 
     @29 WBC 
     @34 Cholesterol ; 
run; 

但最後一欄「膽固醇」無法顯示;所有的值都被替換爲「。」。我的日誌有這麼多筆記錯誤:

NOTE: Invalid data for Cholesterol in line 1 34-37. 
RULE:  ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0      

1 CHAR 1 Female AB Young 7710 7.4 258. 37 
    ZONE 3222246666624425676623333222323223330 
    NUMR 1000065D1C501209F5E7077100007E400258D 
SubjID=1 Gender=Female BloodType=AB AgeGrp=Young RBC=7710 WBC=7.4 Cholesterol=. _ERROR_=1 

任何人都可以幫忙嗎?

回答

2

我猜測你是在UNIX系統上運行它,但你正在讀取的文件(blood.txt)是在Windows系統上創建的,並以二進制模式複製到你的系統中。

如果您查看日誌,您應該注意到輸入行中最後一個值(第37列)後面有一個「點」。顯示屏的ZONE和NUMR部分顯示該位置的十六進制代碼,在本例中爲'0D',這是一個回車符。如果使用UNIX編輯器(如vi)打開該文件,則會在每行末尾看到表示爲^M的那些字符。

您可以從您收到它的地方下載新副本(確保以TEXT模式傳輸文件),也可以將副本轉換爲UNIX文本文件。要轉換,你可以使用dos2unix命令是這樣的:

dos2unix /path/blood.txt /path/blood.txt 

請注意,如果使用相同的名稱將覆蓋原來的文件。當然,我認爲你有權這樣做。

如果由於某種原因無法轉換文件,則可以使用管道進行轉換。換句話說,使用此文件名的語句和改變你的INFILE語句從文件名改爲:

filename mydata pipe "tr -d '\r' < /path/blood.txt"; 
data blood_sum; 
    infile mydata truncover; 
    input @1 SubjID $ 
     @6 Gender $ 
     @13 BloodType $ 
     @16 AgeGrp $ 
     @22 RBC 
     @29 WBC 
     @34 Cholesterol ; 
run; 

我加入了truncover選項雖然你可能不需要它。如果感興趣,請閱讀文檔中的更多內容。

順便說一句,這是一個非常常見的錯誤,至少每個人都會遇到一次。歡迎來到StackOverflow。

0

我會給出一個稍微不同的問題解決方案,我同意鮑勃是由行尾回車引起的。

使用infile上的TERMSTR選項,您可以控制一行的終止字符(通常,對於Windows,CR/LF或'0d'x'0a'x;對於Unix,僅'0a'x或LF) 。

http://support.sas.com/kb/14/178.html

data blood_sum; 
    infile "/path/blood.txt" termstr=CRLF; 
    input @1 SubjID $ 
     @6 Gender $ 
     @13 BloodType $ 
     @16 AgeGrp $ 
     @22 RBC 
     @29 WBC 
     @34 Cholesterol ; 
run; 

順便說一句,我覺得你的輸入法有點混亂。你在這裏混合輸入類型,所以你可能並不總是得到一致的結果。事實上,如果你明確指定了格式,這可能永遠不會發生!

input 
@1 subjid $4. 
@6 gender $6. 
@13 bloodtype $2. 
@16 agegrp $5. 
@22 rbc best8. 
@29 wbc best4. 
@34 Cholesterol 3. 
; 

然後Choleserol將從34-36讀,你會從來沒有SAS試圖以包括變量37。