使用fread导入csv时出现“Embedded nul in string”错误

xvw2m8pv  于 11个月前  发布在  其他
关注(0)|答案(7)|浏览(194)

我有一个大文件(3.5G),我试图使用data.table::fread导入。
它最初是从一个rpt文件创建的,该文件以文本形式打开,并保存为CSV。
这在较小的文件(相同类型的数据,相同的列和所有的。这一个只是为了更长的时间和更广泛的范围)上工作得很好。
当我试着逃跑时

mydata <- fread("mycsv.csv")

字符串
我得到的错误:
fread(“mycsv.csv”)中存在错误:字符串中嵌入了空字符:“y\0e\0a\0r\0”
这意味着什么呢?

jogvjijk

jogvjijk1#

我们可以在命令行中删除null终止符,如下所示:

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

字符串
或者像@marbel建议的那样,fread 允许你在文本中传递 sed 调用。例如:

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

jvlzgdj9

jvlzgdj92#

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

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

字符串
考虑到您的数据大小,使用read.csv将需要几分钟,但我认为这不是一个大问题。

fivyi3re

fivyi3re3#

你可以测试这个小函数:

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

字符串
这是我的工作

nkhmeac6

nkhmeac64#

解决这个问题的一个非技术性方法是,
1.打开有问题的 .csv

  1. Ctrl+A(选择全部)
    1.打开新的Excel工作表
    1.右键单击并选择“粘贴为值”
    1.保存并使用此文件代替原始文件。
    对我很有效,而且不需要太多时间。
n3h0vuf2

n3h0vuf25#

如果你在ASCII文件中看到NUL (x00)字符,你可以这样做:data.table::fread(text = readLines(pathIn, skipNul = T), ...)

xytpbqjk

xytpbqjk6#

我遇到了类似的错误,分享的情况下,别人遇到同样的问题-

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

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

xmakbtuz

xmakbtuz7#

我发现同样的错误可能是由压缩的csv文件,其扩展名不匹配的压缩。
例如,对于用fwrite(mydata, "myfile.csv", compress = "gzip")写的文件,这里的选项compress = "gzip"创建了一个压缩文件,它不是一个文本文件,因为csv本来就是。
在这种情况下,文件被压缩,但文件扩展名不显示它和fread是不能自动删除文件之前阅读。
如果您在UNIX终端中执行head myfile.csv,您可以看到文件是否被压缩,并且打印输出类似于pG * pG 9,而不是您所期望的。
在我的例子中,将文件扩展名重命名为.csv.gz,然后用fread读取就足够了。

相关问题