2014-11-21 112 views
2

我有一個大的CSV文件(8.1 GB),我試圖纏鬥到R.我創建的CSV使用Python的csvkit in2csv時,從一個.txt文件轉換,但不知何故轉換導致文件中出現空字符。導入時,我現在收到此錯誤:「字符串內嵌的NULL」導入大型CSV(8 GB)用fread()

Error in fread("file.csv", nrows = 100) : embedded nul in string: 'ÿþr\0e\0c\0d\0_\0z\0i\0p\0c\0'

上午能夠導入小塊只是read.csv雖然很好,但是這是因爲它允許通過fileEncoding參數UTF-16編碼。

test <- read.csv("file.csv", nrows=100, fileEncoding="UTF-16LE") 

我不敢嘗試導入8 GB的文件與read.csv,雖然。

因此,我然後嘗試提供的解決方案​​,其中您使用sed s/\\0//g file.csv > file2.csv拉空位。該命令執行得很好,填充新的8GB CSV文件,但我收到了幾乎相同的錯誤:

Error in fread("file2.csv", nrows = 100) : embedded nul in string: 'ÿþr\0e\0c\0d\0_\0z\0i\0p\0c\0,\0p\0o\0s\0t\0_\0z\0i

所以,沒有工作。我很困惑這一點。考慮到文件的大小,我不能在整個事情上使用read.csv,我不確定如何擺脫原始CSV中的空值。我甚至不確定文件是如何編碼爲UTF-16的。任何建議或建議,將不勝感激在這一點上。

編輯:我在Windows機器上。

+0

除非你永遠不會再次得到這個數據饋通相同的過程,好像這將是值得,而在源固定數據,:-(......但是這是一個不同的問題。好!運氣 – shellter 2014-11-22 13:28:26

回答

3

如果你在Linux/Mac上,試試這個

file <- "file.csv" 
tt <- tempfile() # or tempfile(tmpdir="/dev/shm") 
system(paste0("tr < ", file, " -d '\\000' >", tt)) 
fread(tt) 
+0

我很遺憾我在Windows(應該已經指定了前面,道歉),我這樣做,不過,已經安裝的GnuWin32這就是我如何能夠使用'之前sed'是否有一個相當於我可以運行。? – AnnotBib 2014-11-21 20:29:25

0

我覺得荒謬的人物發生,因爲文件被壓縮。這是我在嘗試閱讀vcf.gz文件時發現的。 fread似乎不支持讀取壓縮文件。見例如https://github.com/Rdatatable/data.table/issues/717

readLines()read.table()支持壓縮文件,但它們比較慢。