使用fread导入csv时出现'嵌入nul in string'错误

时间:2014-03-25 18:32:42

标签: r data.table fread

我有一个大文件(3.5G),我试图使用data.table::fread导入。

它最初是从一个rpt文件创建的,该文件以文本形式打开并保存为CSV格式。

这适用于较小的文件(相同类型的数据 - 相同列和所有。这个只是更长的时间范围和更广泛的范围)。

当我尝试并运行时

mydata <- fread("mycsv.csv")

我收到错误:

  

fread(“mycsv.csv”)中的错误:字符串中嵌入的nul:'y \ 0e \ 0a \ 0r \ 0'

这是什么意思?

6 个答案:

答案 0 :(得分:14)

我们可以使用类似命令删除命令行上的空终止符:

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

或者根据@marbel的建议, fread 允许您在文本中传递 sed 调用。如:

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

答案 1 :(得分:4)

在这种情况下,您可以使用read.csv使用UTF-16LE的fileEncoding而不是fread

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

考虑到您的数据大小,使用read.csv需要几分钟,但我认为这不是什么大问题。

答案 2 :(得分:4)

您可以测试这个小功能:

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

它为我工作

答案 3 :(得分:2)

解决这个问题的非技术方法是

  1. 打开有问题的 .csv

  2. Ctrl + A(全选)

  3. 打开新的Excel表格

  4. 右键单击并选择“粘贴为值”

  5. 保存并使用此文件代替原始文件。

  6. 为我工作,并没有花太多时间。

答案 4 :(得分:1)

如果在ASCII文件中看到NUL(x00)字符,则可以执行以下操作: data.table :: fread(text = readLines(pathIn,skipNul = T),...)

答案 5 :(得分:1)

我遇到了类似的错误,如果其他人遇到相同的问题,我会分享-

  embedded nul in string: '\0HA\xa8S\001\0\0\0\xd8@\xa8S\001\0\0\0h@\xa8S\001\0\0\0\xf8?\xa8S\001\0\0\0\x88'
Calls: as.data.table -> fread

最终导致此原因的原因是我的第一列(标题)比其余列短,列长度不同。