2017-02-17 73 views
0

我在將CSV文件讀入SAS數據集時未遇到導入每個字段的問題。我不希望每個字段都導入,但這是我看起來能夠實現這一目標的唯一方式。問題是我無法正確讀取我的數據,即使它正確地讀取列中的數據......我認爲問題的一部分是,我的數據超出了我的實際列標題,我不想讀取。SAS - 讀取原始/分隔文件

我的數據,像這樣

somevalue somevalue somevalue... 
var1 var2 var3 var4 
abc abc abc  abc 

,我想排除someValue中,只有在選擇VAR的和它們對應的數據讀佈局。

下面是一個示例文件,其中我已經對我的字段中的所有值進行了置亂。我只是想保持H列(8),AT(46)和BE(57)

下面是一些代碼到目前爲止,我已經試過......

這是從PROC IMPORT產生SAS。我的PROC IMPORT工作得很好,在字段值中讀取,所以我剛剛刪除了我不想要的字段,但我沒有得到我期望的輸出。與這些字段對應的值不匹配。

A) PROC IMPORT 
       DATAFILE="C:\Users\dip1\Desktop\TU_&YYMM._FIN.csv" 
       OUT=TU_&YYMM._FIN 
       DBMS=csv REPLACE; 
       GETNAMES=NO; 
       DATAROW=3; 


RUN; 

在SAS日誌中生成的(我切出的其他領域,我不想)

B) DATA TU_&YYMM._FIN_TEST; 
infile 'C:\Users\fip1\Desktop\TU_1701_FIN.csv' delimiter = ',' DSD lrecl=32767 
firstobs=3 ; 
informat VAR8 16. ; 
informat VAR46 $1. ; 
informat VAR57 $22. ; 
format VAR8 16. ; 
format VAR46 $1. ; 
format VAR57 $22. ; 
input 
VAR8 
VAR46 $ 
VAR57 $; 
run; 

我也試過這個下面......我相信我只是缺少東西..

C) DATA TU_TEST; 

INFILE "C:\Users\fip1\Desktop\TU_&yymm._fin.csv" DLM = "," TRUNCOVER FIRSTOBS = 3; 

LABEL ACCOUNT_NUMBER = "ACCOUNT NUMBER"; 

LENGTH ACCOUNT_NUMBER $16. 
     E $1. 
     REJECTSUBCATEGORY $22.; 

INPUT ACCOUNT_NUMBER 
     E 
     REJECTSUBCATEGORY; 
RUN; 

除了想有SAS點我想讀列中,修改上述到:

D) DATA TU_TEST; 

INFILE "C:\Users\fip1\Desktop\TU_&yymm._fin.csv" DLM = "," TRUNCOVER FIRSTOBS = 3; 

LABEL ACCOUNT_NUMBER = "ACCOUNT NUMBER"; 

LENGTH ACCOUNT_NUMBER $16. 
     E $1. 
     REJECTSUBCATEGORY $22.; 

INPUT @8 ACCOUNT_NUMBER 
     @46 E 
     @57 REJECTSUBCATEGORY; 
RUN; 

沒有哪個工作。再一次,如果我把所有的領域都帶進A)或B),我可以成功地做到這一點,因爲B)包括所有的領域,但我不能得到C)或D)的工作,我想如果可以的話,儘量減少代碼。我敢肯定我錯過了一些東西,但我從來沒有時間去鼓搗它,所以我只是一直這樣做的「長」的方式。

這是一個什麼樣的數據看起來像片段

A(1)  B(2)  C(3)   D(4)   E(5)  F(6)  G(7) 
ABCDEFGHIJ ABCDMCARD 202020 4578917  12345674 457894A (blank) 
    CRA  INTERNALID SUBCODE  RKEY   SEGT  FNM  FILEDATE 
CREDITBUR  2ABH123 AB2CHE123 A28O5176688  J2  Name  8974561 

回答

1

你需要閱讀所有的字段(或至少所有的字段取決於你要保留的最後一個),即使你不希望將所有的分隔的文件那些領域。對於你想跳過的那些,你可以把它們讀入一個你放棄的虛擬變量。或者甚至是你想保留的變量之一,你將通過閱讀後面的專欄來覆蓋它。

也不要在PROC IMPORT生成的代碼之後建模您的DATA步驟。你可以自己製作更簡潔的代碼。例如,對於列出的三個變量,不需要任何FORMAT或INFORMAT語句。雖然如果VAR8真的需要16位數字,您可能需要附加一個格式,以便SAS不使用BEST12。格式。

data tu_&yymm._fin_test; 
    infile 'C:\Users\fip1\Desktop\TU_1701_FIN.csv' 
     dlm=',' dsd lrecl=32767 truncover firstobs=3 
    ; 
    length var8 8 var46 $1 var57 $22 ; 
    length dummy $1 ; 
    input 7*dummy var8 37*dummy var46 10*dummy var57 ; 
    drop dummy ; 
    format var8 16. ; 
run; 

如果需要(或添加RENAME語句),可以用更有意義的替換VARxx變量名稱。在這裏使用位置編號使得它在代碼中更加清晰,即INPUT語句正在從輸入數據中讀取57列。

+0

啊,我想我明白了這個問題。 SAS正在閱讀變量標題,我的印象是SAS知道字段名稱是「在哪裏」,並且正在盜用它下面的數據。基本上,我在例子C)中做的是改變了我的字段名稱,但保持字段值。我相信你在做什麼是推動輸入緩衝區的位置來讀取適當的值...(可能會被屠殺) – DukeLuke

+0

是否有一個原因,我們有兩個長度語句之間的「虛擬」和我想要的實際領域使用? – DukeLuke

+1

爲了使代碼更具可讀性,我使用了兩條LENGTH語句。我喜歡在一個地方定義表格的變量。 DUMMY變量實際上並不是輸出表的一部分,所以我把它放在一個單獨的語句中。 – Tom