2014-03-25 304 views
20

我有一個大型文件(3.5G),我試圖使用data.table::fread導入。導入帶fread的csv時出現'Embedded nul in string'錯誤

它最初是從一個以文本形式打開並保存爲CSV的rpt文件創建的。

對於較小的文件(相同類型的數據相同的列和所有文件,這只是一個更長的時間範圍和更廣泛的覆蓋範圍)。

當我嘗試運行

mydata <- fread("mycsv.csv") 

我得到的錯誤:

Error in fread("mycsv.csv") : embedded nul in string: 'y\0e\0a\0r\0'

這是什麼意思?

sed 's/\\0//g' mycsv.csv > mycsv.csv 

或由@marbel建議,FREAD允許您通過sed的文字裏面電話:

+3

它看起來像UTF-16(每個字符2個或更多字節,幾乎總是2個字節)。對於ASCII,您將看到ASCII值,然後是0字節。 –

+1

加載從大型數據集生成的RData文件時,我遇到了同樣的問題。我重新生成了RData,問題消失了。似乎是因爲我的內存不足而造成的。 – Cyrille

+0

當您嘗試用'fread'不恰當地打開RDS文件時,也會出現此錯誤。不要問我如何知道這一點。 –

回答

11

我們可以使用類似的刪除命令行上的空終止符。如:

fread("sed 's/\\0//g' mycsv.csv") 
+1

感謝您的回覆。我不完全確定如何在R中輸入。 有一件事我意識到,顯然,錯誤是告訴我嵌入的nul在字符串'year'中,這是第一行的第一個字csv(它是第一列標題)。 完整的錯誤是 [錯誤的fread( 「allpcts90days1.csv」):在字符串 內嵌的NULL: 'Y \ 0E \ 0A \ 0R \ 0'] 任何想法是在告訴我?當我在文本編輯器(TextPad或UltraEdit中查看文本,因爲他們可以處理這種大小的文件)時,我看不到什麼不尋常的東西。 – datahappy

+1

您的文本文件具有保留在ASCII碼中用於終止字符串的字符。您需要從Linux命令行運行該腳本,或者如果您在Windows上運行Google,則需要Google提供「如何從文件窗口中刪除特殊字符」。 –

+19

'fread'允許您在文本內傳遞sed調用。例如:'fread(「sed's/\\ 0 // g'mycsv.csv」)' – marbel

3

在這種情況下,你可以使用read.csv用UTF-16LE,而不是fread的fileEncoding。

read.csv("mycsv.csv",fileEncoding="UTF-16LE") 

考慮您的數據的大小,使用read.csv將需要幾分鐘的時間,但我認爲這不是一個大問題。

+1

有了這個大小數據,它實際上可以接近一個小時。 –

+0

根據我的經驗,加載3.5GB數據幾乎不會超過15分鐘,除非在某些極端情況下。 – Fan

3

您可以測試這個小功能:

cleanFiles<-function(file,newfile){ 
    writeLines(iconv(readLines(file,skipNul = TRUE)),newfile) 
} 

這是爲我工作

1

一個非技術的方式來解決,這將是,以

  1. 打開問題。 csv

  2. Ctrl + A (全選)

  3. 打開新的Excel表

  4. 右擊並選擇「粘貼爲值」

  5. 保存並取代原來的使用這個文件。

爲我工作,而且不需要太多時間。