我有一个大文件(3.5G),我正在尝试使用
data.table::fread
导入。
它最初是从一个以文本形式打开并保存为 CSV 的 rpt 文件创建的。
这对于较小的文件(相同类型的数据、相同的列等)效果很好。这个只是为了更长的时间范围和更广泛的覆盖范围)。
当我尝试跑步时
mydata <- fread("mycsv.csv")
我收到错误:
fread("mycsv.csv") 中的错误:在字符串中嵌入 nul:'y e a r '
这是什么意思?
我们可以使用以下命令删除命令行上的空终止符:
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("mycsv.csv",fileEncoding="UTF-16LE")
考虑到您的数据大小,使用
read.csv
将需要几分钟,但我认为这没什么大不了的。
你可以测试一下这个小功能:
cleanFiles<-function(file,newfile){
writeLines(iconv(readLines(file,skipNul = TRUE)),newfile)
}
这对我来说是工作
解决此问题的一种非技术方法是
打开有问题的.csv
Ctrl+A(全选)
打开新的 Excel 工作表
右键单击并选择“粘贴为值”
保存并使用此文件代替原始文件。
为我工作,不需要太多时间。
如果您在 ASCII 文件中看到
NUL (x00)
字符,您可以执行以下操作:
data.table::fread(text = readLines(pathIn, 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
造成这种情况的原因是列长度不同,我的第一列(标题)比其他列短。
我发现同样的错误可能是由扩展名与压缩不匹配的压缩的csv文件引起的。
例如,对于使用
fwrite(mydata, "myfile.csv", compress = "gzip")
编写的文件。
在这种情况下,文件被压缩,但文件扩展名不显示,并且
fread
无法在读取之前自动解压缩文件。
如果您在 UNIX 终端中执行
head myfile.csv
操作,您可以查看文件是否被压缩,并且打印输出类似于 ��pG*ʵ��9,而不是您期望的内容。
就我而言,将文件扩展名重命名为
.csv.gz
,然后使用 fread
读取它就足够了。