使用fread()导入大型CSV(8 GB)时“在字符串中嵌入nul”

时间:2014-11-21 20:14:32

标签: r csv sed data.table fread

我有一个大的CSV文件(8.1 GB),我试图与R争吵。我使用Python的csvkit in2csv创建了CSV,从.txt文件转换,但是不知何故,转换导致文件中出现空字符。我导入时出现此错误:

Error in fread("file.csv", nrows = 100) : embedded nul in string: 'ÿþr\0e\0c\0d\0_\0z\0i\0p\0c\0'

能够使用read.csv轻松导入小块,但这是因为它允许通过fileEncoding参数进行UTF-16编码。

test <- read.csv("file.csv", nrows=100, fileEncoding="UTF-16LE")

我不敢尝试使用read.csv导入8 GB文件。

然后我尝试了提供here的解决方案,在其中使用sed s/\\0//g file.csv > file2.csv来取出空值。该命令执行得很好,并填充了一个新的8GB CSV文件,但我收到了几乎相同的错误:

Error in fread("file2.csv", nrows = 100) : embedded nul in string: 'ÿþr\0e\0c\0d\0_\0z\0i\0p\0c\0,\0p\0o\0s\0t\0_\0z\0i

所以,那没有用。我此刻难过。考虑到文件的大小,我不能在整个事情上使用read.csv,而且我不确定如何摆脱原始CSV中的空值。我甚至不确定文件是如何编码为UTF-16的。任何建议或建议都会在这一点上受到高度赞赏。

编辑:我在Windows计算机上。

3 个答案:

答案 0 :(得分:3)

如果您使用的是linux / mac,请尝试使用

file <- "file.csv"
tt <- tempfile()  # or tempfile(tmpdir="/dev/shm")
system(paste0("tr < ", file, " -d '\\000' >", tt))
fread(tt)

答案 1 :(得分:0)

可能的选择是从http://win-bash.sourceforge.net/在您的计算机上安装bash模拟器,并使用Linux工具删除空终止的字符串,例如,如下所述:Identifying and removing null characters in UNIX或{{3} }

答案 2 :(得分:0)

我认为无意义的字符是因为文件被压缩而发生的。这是我在尝试阅读vcf.gz文件时发现的。 fread似乎不支持读取压缩文件。参见例如https://github.com/Rdatatable/data.table/issues/717

readLines()read.table()支持压缩文件,但速度较慢。