【问题标题】:fread: how to espace separators inline in field values?fread:如何在字段值中内联分隔分隔符?
【发布时间】:2017-01-20 12:51:19
【问题描述】:

请注意,R 的基本命令 read.csv 的工作方式是 read.csv(file=fileName, dec=".", sep=",", header=T)fread 在下面的演示中不起作用,内联引用了分隔符。我们现在专注于 data.table 和 fread,read.csv 太慢了。


我有一个 csv 文件,其中逗号作为字段值分隔符,点作为小数点。文件MyFile.csv 的字段名称带有逗号和点,例如"Product.Apple.Green,Purple",其中双引号试图分隔点和逗号。但是,双引号的分隔不适用于 fread,这样

Sys.setlocale('LC_NUMERIC', 'fi_FI.UTF-8')   
fread(file="MyFile.csv", sep=",", dec=".")

例如字段

`CustomerID, ProductID, Prod.Sub, "Prod.Sub,feature", A.B.C, "A,B,C,D"` 

被读取,破折号-现在表示字段分离,如

`CustomerID - ProductID - Prod.Sub - "Prod.Sub - feature" - A.B.C - "A - B - C - D"` 

其中"Prod.Sub, feature" 被错误地读取为两个字段"Prod.Sub - feature""A,B,C,D" 被错误地读取为"A - B - C - D"

如何使用 data.table 的 fread 内联转义分隔符?

【问题讨论】:

  • 您使用的是哪个版本的data.table?当我使用fread('myfile.csv') 时,数据会在最新版本中正常读取(我使用您描述的字段名称制作了一个 csv 文件)。也许您可以包含 csv 文件的第一行?
  • 无法在 v1.9.6 上复制。 freaddt= fread( 'CustomerID, ProductID, Prod.Sub, "Prod.Sub,feature", A.B.C, "A,B,C,D" 1,2,3,4,5,6' ) 上按预期工作(请注意,标题和数据之间有一个新行 - 在 cmets 中不显示)
  • @Jaap data.table 是 1.10.0 版本。 R 的 sessionInfo() 数据 here 和语言环境是 C/UTF-8/C/C/C/C,如果 fread 使用分隔符的位置参数会不会有问题?
  • 我无法用 v1.10.0 重现这个。您能否在问题中包含重现此问题的步骤?

标签: r csv escaping data.table


【解决方案1】:

fread 很酷,它可以使用系统命令(至少在 Unix 上)。

所以使用sed,例如:

fread("sed 's/,\ /| /g' MyFile.csv", sep = "|", dec = ".")

用任何可能不冲突的分隔符替换|

注意:在您的文本示例中,分隔符显示为 , + (空格)。没有空间,解决方案就行不通!

另外:没有空格(仅,),引用的字段由fread 使用data.table 1.10.0 版正确处理

【讨论】:

    猜你喜欢
    • 2012-02-19
    • 1970-01-01
    • 2015-08-02
    • 2014-10-14
    • 2013-04-30
    • 2016-01-23
    • 2021-04-19
    • 2019-04-17
    • 2021-01-08
    相关资源
    最近更新 更多