Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用fread导入csv时出现“字符串中嵌入nul”错误_R_Data.table_Fread - Fatal编程技术网

使用fread导入csv时出现“字符串中嵌入nul”错误

使用fread导入csv时出现“字符串中嵌入nul”错误,r,data.table,fread,R,Data.table,Fread,我有一个大文件3.5G,我正试图使用data.table::fread导入它 它最初是从rpt文件创建的,该文件以文本形式打开并保存为CSV 这对于具有相同数据类型、相同列和所有列的较小文件都很有效。这只是为了更长的时间和更广泛的影响 当我试着跑的时候 mydata <- fread("mycsv.csv") 我得到一个错误: freadmycsv.csv中出错:字符串中嵌入nul:“y\0e\0a\0r\0” 这意味着什么?我们可以使用以下方法删除命令行上的空终止符: sed 's/\

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

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

这对于具有相同数据类型、相同列和所有列的较小文件都很有效。这只是为了更长的时间和更广泛的影响

当我试着跑的时候

mydata <- fread("mycsv.csv")
我得到一个错误:

freadmycsv.csv中出错:字符串中嵌入nul:“y\0e\0a\0r\0”


这意味着什么?

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

sed 's/\\0//g' mycsv.csv > mycsv.csv
或者按照@marbel的建议,fread允许您在文本中传递sed调用。例如:

fread("sed 's/\\0//g' mycsv.csv")
在这种情况下,您可以将read.csv与文件编码UTF-16LE而不是fread一起使用


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

您可以测试这个小功能:

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

这对我来说是一种工作

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

打开有问题的.csv文件

Ctrl+A全选

打开新的Excel工作表

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

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

为我工作,不需要太多时间。

如果您在ASCII文件中看到NUL x00字符,可以执行以下操作:
data.table::freadtext=readLinespathIn,skipNul=T,…

我遇到了类似的错误,以防其他人遇到相同的问题-

  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

最终导致这种情况的原因是不同的列长度,其中我的第一列标题比其他列短。

感谢您的回复。我不确定如何在R中输入。显然,我意识到的一件事是,错误告诉我嵌入的nul在字符串“year”中,这是csv第一行的第一个字,它是第一列标题。完整的错误是[error in freadallpcts90days1.csv:embedded numl in string:'y\0e\0a\0r\0']你知道这是什么意思吗?当我在文本编辑器TextPad或UltraEdit中查看文本时,因为它们可以处理这种大小的文件,所以我看不到任何异常。您的文本文件包含ASCII中保留的字符,用于终止字符串。您需要从linux命令行运行该命令,或者如果您在Windows上,Google将了解如何从文件Windows中删除特殊字符。fread允许您在文本中传递sed调用。例如:freadsed的/\\0//g“mycsv.csvIt说:“sed”不被识别为内部或外部命令,此外,我收到一个空文件错误。看起来UTF-16每个字符有2个或更多字节,几乎总是2个字节。对于ASCII,您将看到ASCII值,然后是0字节。在加载从大型数据集生成的RData文件时,我也遇到了同样的问题。我重新生成RData,问题就消失了。似乎是由于我的RAM已达到最大值时引起的。当您尝试使用fread不适当地打开RDS文件时,也会发生此错误。不要问我是怎么知道的。有了这样大的数据量,它实际上可以接近一个小时。根据我的经验,加载3.5GB数据几乎不可能超过15分钟,除非在一些非常极端的情况下。@FanWang它取决于列类型
  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