2014-04-28 49 views
3

我使用SAS在Windows機器上以utf8編碼保存製表符分隔的文本文件。然後我試圖在R鍵打開此:擺脫SAS與R之間的BOM

read.table(myfile, header =TRUE, sep = "\t") 

令我驚訝的是,數據是完全搞砸了,但只是偷偷摸摸。數值隨機變化,但總體佈局看起來很正常,所以我花了一段時間才發現問題,現在我假設的是BOM

這當然不是一個新問題;他們解決這個問題簡單here,並推薦使用

read.table(myfile, fileEncoding = "UTF-8", header =TRUE, sep = "\t") 

然而,這樣做毫無起色!我唯一的解決辦法是抑制頭,帶或不帶fileEncoding說法:

read.table(myfile, fileEncoding = "UTF-8", header =FALSE, sep = "\t") 
read.table(myfile, header =FALSE, sep = "\t") 

在任何情況下,我必須做一些不道德的事,以取代第一行的列名,但只有在我刪除一些在第一列名稱開頭出現的BOM版本(<U+FEFF>,如果我使用fileEncoding如果我不使用fileEncoding)。

是不是有一個簡單的方法來刪除BOM並使用read.table而沒有任何特殊的參數?

更新@Joe: 的SAS,我用:進一步怪事

FILENAME myfile 'C:\Documents ... file.txt' encoding="utf-8"; 
proc export data=lib.sastable 
    outfile=myfile 
    dbms=tab replace; 
    putnames=yes; 
run; 

更新:下面使用fileEncoding="UTF-8-BOM"如@Joe在他的解決方案建議似乎去掉BOM。 但是,它並沒有解決我最初的激勵問題,這是數據中的腐敗問題;標題行很好,但奇怪的是,第一列數字的最後幾個數字會混亂。我會給喬信貸的答案 - 也許我的問題實際上不是BOM問題?

黑客解決方案:使用fileEncoding="UTF-8-BOM"並且還包括參數colClasses = "character"。不知道爲什麼這可以解決數據腐敗問題 - 可能是未來問題的主題。

+2

你如何在SAS中寫出文件? – Joe

+0

@Joe,查看有關問題的更新。 – zkurtz

+0

我認爲UTF-8是不可協商的,而不是SAS會話的編碼? – Joe

回答

3

根據你的鏈接,它看起來像我的作品有:

read.table('c:\\temp\\testfile.txt',fileEncoding='UTF-8-BOM',header=TRUE,sep='\t') 

注意到在文件編碼-BOM。

這是在r文檔中的2.1 Variations on read.table。在12 Encoding下,請參閱「在UNIX下您可能需要......」,現在甚至在Windows上顯然也適用(至少對我而言)。

+0

驚訝地看到,儘管有文檔,它仍然適用於Windows! – zkurtz

0

或者您可以使用sas系統選項options=NOBOMFILE寫入沒有BOM的uft-8文件。