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

dat*_*ppy 28 r fread data.table

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

它最初是从作为文本打开并保存为CSV的rpt文件创建的.

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

当我试着跑

mydata <- fread("mycsv.csv")
Run Code Online (Sandbox Code Playgroud)

我收到错误:

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

这是什么意思?

Rob*_*ski 14

我们可以使用以下命令删除命令行上的null终止符:

sed 's/\\0//g' mycsv.csv > mycsv.csv
Run Code Online (Sandbox Code Playgroud)

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

fread("sed 's/\\0//g' mycsv.csv")
Run Code Online (Sandbox Code Playgroud)

  • `fread`允许你在文本中传递sed调用.如:`fread("sed's/\\ 0 // g'mycsv.csv")` (21认同)
  • 谢谢回复.我不确定如何在R中输入它.有一件事我意识到,显然,错误告诉我嵌入式nul在字符串'year'中,这是csv第一行的第一个字(这是第一列标题).完整的错误是[fread中的错误("allpcts90days1.csv"):在字符串中嵌入nul:'y\0e\0a\0r\0']任何想法告诉我什么?当我在文本编辑器(TextPad或UltraEdit中查看文本,因为它们可以处理这种大小的文件)时,我看不出任何与众不同的东西. (2认同)

Fan*_*ang 5

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

read.csv("mycsv.csv",fileEncoding="UTF-16LE")
Run Code Online (Sandbox Code Playgroud)

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


小智 5

您可以测试这个小功能:

cleanFiles<-function(file,newfile){
  writeLines(iconv(readLines(file,skipNul = TRUE)),newfile)
}
Run Code Online (Sandbox Code Playgroud)

这对我来说是工作