2016-11-27 44 views
0

我的文件是這樣的:爲什麼不SAS讀取文件正確基於逗號分隔符或閱讀全線

"John","Smith","Blah, John B","1234 N Something St","New Orleans","Orleans","LA",70116,"555-555-5555","666-555-1234","[email protected]","http://www.something.com" 
"John2","Smith2","Blah2, John2 B","4567 S Blah St","New Orleans2","Orleans2","LA2",70116,"777-555-5555","777-555-1234","[email protected]","http://www.something2.com" 

文件是相當大的,但我在這裏只保留兩行簡單。

我的SAS代碼:

data sample; 
    infile '/folders/myfolders/samplefile2.csv' dsd dlm="," missover; 
    input first_name$ last_name$ company_name$ address$ city$ county$ state$ zip$ phone1$ phone2$ email$ web$; 
run; 

proc print data=sample; 
run; 

我得到的輸出是:

    c 
        o 
    f    m 
    i  l  p 
    r  a  a 
    s  s  n  a 
    t  t  y  d     c     p  p 
    _  _  _  d     o  s   h  h  e 
    n  n  n  r  c  u  t   o  o  m 
O a  a  a  e  i  n  a z  n  n  a  w 
b m  m  m  s  t  t  t i  e  e  i  e 
s e  e  e  s  y  y  e p  1  2  l  b 

1 John Smith Blah, Jo 1234 N S New Orle Orleans LA 70116 555-555- 666-555- [email protected] http://w 

我的問題是,爲什麼我無法正確讀取數據,或者爲什麼它甚至沒有閱讀第二行?

+0

我編輯了您的問題,以便它不再包含個人信息。請勿將其他人的個人信息發佈到StackOverflow(或其他互聯網上的其他任何地方)。花時間去創建一些虛擬信息。 –

回答

0

第一個明顯的問題是,您通過讀取FIRST_NAME變量中的前15個字符而忽略了分隔符。這會弄亂其餘部分。

從分隔文件讀取時,應使用列表樣式INPUT語句而不是格式化樣式。另外我發現如果我定義我的變量而不是強迫SAS根據我第一次使用它們來猜測我想要的是什麼,我的程序就更清晰了。所以讓我們轉換你的程序。

data sample; 
    infile '/folders/myfolders/samplefile2.csv' dsd dlm="," TRUNCOVER; 
    LENGTH first_name $15 last_name $8 company_name $8 
     address $8 city $8 county $8 state $8 zip $8 
     phone1 $8 phone2 $8 email $8 web $8 
    ; 
    input first_name -- web ; 
run; 

這也表明,你已經定義了很多的變量(如電子郵件和網頁)的作爲是太短了,他們將需要保存的值。

至於第二行問題,最有可能是由於行之間沒有正確的行尾字符。由於它看起來像你在Unix上閱讀那麼這可能是因爲你的行尾字符是CR(回車或'0D'x)而不是LF(換行或'0A'x)。嘗試將TERMSTR=CR添加到您的INFILE語句中。

+0

謝謝。 @Tom工作得很好。你能否幫助我閱讀其餘的數據?該代碼只讀取第一行。如何閱讀其他人。 – user1573470

+0

哇。謝謝@tom。這樣可行。是的,我使用的是UNIX,結果是CR。謝謝。 – user1573470

+0

Mac原來使用的CR作爲行尾,但Mac's現在使用Unix。但是MAC上的Excel是我知道的唯一認爲Mac仍然使用CR作爲行尾的程序。你可以選擇不同的文件類型來使用正常的行結束。 – Tom