R数据表(data.table)fread如何处理嵌入的^@字符?

4

我无法使用fread读取这个csv文件:


➜  Downloads cat t2.csv 
47616412|76-398-12||||7639812
47616413|53-1696-18||||53169618

我认为这是因为在vim中我看到了这些字符:

47616412|76-398-12||^@||7639812

而且fread在第4列添加一个换行符,怎么处理?

编辑 1

请注意,标准控制台输出不显示这些字符:

➜  Downloads cat t2.csv 
47616412|76-398-12||||7639812
47616413|53-1696-18||||53169618

我只在vim中看到它们:

47616412|76-398-12||^@||7639812
47616413|53-1696-18||^@||53169618

编辑2

还要注意,使用skipNulread.csv是有效的:

> read.csv("t2.csv", sep="|",header=FALSE,skipNul=TRUE)
        V1         V2 V3 V4 V5       V6
1 47616412  76-398-12 NA NA NA  7639812
2 47616413 53-1696-18 NA NA NA 53169618

编辑 3

这是文件!点击此处下载


(注:该文件与IT技术无关,仅为网盘下载链接)

不确定如何设置 na.strings = "^@",但这不是它。我认为它不是一个普通字符。问题已更新。 - Florian Oswald
这似乎与https://stackoverflow.com/questions/45973059/how-to-handle-data-with-no-space-between-separators-when-using-fread-in-r有关。 - Florian Oswald
更新了带有可下载文件的问题。 - Florian Oswald
我建议在将它们读入R之前从shell中删除空格字符。https://dev59.com/xXE95IYBdhLWcg3wPbZ7 - Humpelstielzchen
可以在下载之前使用'sed/awk pipe trick' -- fread 可以从管道中读取,因此您可能需要在那里进行预处理。 - Dirk Eddelbuettel
显示剩余5条评论
1个回答

4

这个问题已在dev 1.12.3中得到解决(请见NEWS):

  1. fread()现在跳过嵌入的NUL(\0),#3400。感谢Marcus Davy提供实例报告,以及Roy Storey的最初PR。

我检查了你在问题中附加的文件,确实在CRAN的1.12.2中失败了,但在dev中可以工作。

> library(data.table)   # v1.12.2 on CRAN 07 Apr 2019
> fread("~/Downloads/t2.csv")
Empty data.table (0 rows and 1 cols): 47616412|76-398-12||
Warning message:
In fread("~/Downloads/t2.csv") :
  Stopped early on line 2. Expected 1 fields but found 1. Consider fill=TRUE
  and comment.char=. First discarded non-empty line: <<>>

但是在 dev 1.12.3 版本中它现在可以工作:

> library(data.table)   # v1.12.3 in development as of 17 Apr 2019
> fread("~/Downloads/t2.csv")
         V1         V2     V3     V4     V5       V6
      <int>     <char> <lgcl> <lgcl> <lgcl>    <int>
1: 47616412  76-398-12     NA     NA     NA  7639812
2: 47616413 53-1696-18     NA     NA     NA 53169618
>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接