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

问题描述 投票:0回答:7

我有一个大文件(3.5G),我正在尝试使用

data.table::fread
导入。

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

这对于较小的文件(相同类型的数据、相同的列等)效果很好。这个只是为了更长的时间范围和更广泛的覆盖范围)。

当我尝试跑步时

mydata <- fread("mycsv.csv")

我收到错误:

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

这是什么意思?

r data.table fread
7个回答
22
投票

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

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

或者按照@marbel的建议,fread允许您在文本内传递sed调用。如:

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

13
投票

在这种情况下,您可以使用

read.csv
和 UTF-16LE 文件编码而不是
fread

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

考虑到您的数据大小,使用

read.csv
将需要几分钟,但我认为这没什么大不了的。


5
投票

你可以测试一下这个小功能:

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

这对我来说是工作


4
投票

解决此问题的一种非技术方法是

  1. 打开有问题的.csv

  2. Ctrl+A(全选)

  3. 打开新的 Excel 工作表

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

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

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


2
投票

如果您在 ASCII 文件中看到

NUL (x00)
字符,您可以执行以下操作:
data.table::fread(text = readLines(pathIn, skipNul = T), ...)


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

造成这种情况的原因是列长度不同,我的第一列(标题)比其他列短。


0
投票

我发现同样的错误可能是由扩展名与压缩不匹配的压缩的csv文件引起的。

例如,对于使用

fwrite(mydata, "myfile.csv", compress = "gzip")
编写的文件。

在这种情况下,文件被压缩,但文件扩展名不显示,并且

fread
无法在读取之前自动解压缩文件。

如果您在 UNIX 终端中执行

head myfile.csv
操作,您可以查看文件是否被压缩,并且打印输出类似于 ��pG*ʵ��9,而不是您期望的内容。

就我而言,将文件扩展名重命名为

.csv.gz
,然后使用
fread
读取它就足够了。

© www.soinside.com 2019 - 2024. All rights reserved.