【问题标题】:Read csv file in R with double quotes用双引号读取 R 中的 csv 文件
【发布时间】:2015-08-19 19:04:50
【问题描述】:

假设我有一个如下所示的 csv 文件:

Type,ID,NAME,CONTENT,RESPONSE,GRADE,SOURCE
A,3,"","I have comma, ha!",I have open double quotes",A,""

期望的输出应该是:

df <- data.frame(Type='A',ID=3, NAME=NA, CONTENT='I have comma, ha!',
                 RESPONSE='I have open double quotes\"', GRADE=A, SOURCE=NA)
df
  Type ID NAME           CONTENT                   RESPONSE GRADE SOURCE
1    A  3   NA I have comma, ha! I have open double quotes"     A     NA

我尝试使用read.csv,因为数据提供者使用引号来转义字符串中的逗号,但是他们忘记了在没有逗号的情况下转义字符串中的双引号,所以无论我是否禁用read.csv中的引号我都赢了'没有得到想要的输出。

如何在 R 中做到这一点?也欢迎其他软件包解决方案。

【问题讨论】:

  • read.csv("data.csv", quote='', sep=',') 不起作用,因为content 列将是错误的。 read.csv("data.csv", quote='') 不起作用,因为列没有正确分离

标签: r csv


【解决方案1】:

来自data.tablefread 处理得很好:

library(data.table)

fread('Type,ID,NAME,CONTENT,RESPONSE,GRADE,SOURCE
A,3,"","I have comma, ha!",I have open double quotes",A,""')
#   Type ID NAME           CONTENT                   RESPONSE GRADE SOURCE
#1:    A  3      I have comma, ha! I have open double quotes"     A       

【讨论】:

  • 不错的一个。我自己应该想到的。
【解决方案2】:

我不太清楚CSV文件的结构,但你说作者在内容下的文本中转义了逗号。

这可以按原样读取文本,最后带有"

read.csv2("Test.csv", header = T,sep = ",", quote="")

【讨论】:

  • 这与read.csv(text = text, quote="") 有何不同?虽然这也没有给出我猜想要的输出。
  • 试过这个解决方案。列会移动,因此无法获得所需的输出。
  • 实际上使用这个解决方案,列也被拆分了。
【解决方案3】:

这不是有效的 CSV,因此您必须自己进行解析。但是,假设约定如下,您可以使用scan 切换以利用其大部分功能:

  1. 如果字段以引号开头,则为引号。
  2. 如果字段不以引号开头,则为原始字段

next_field<-function(stream) {
  p<-seek(stream)
  d<-readChar(stream,1)
  seek(stream,p)
  if(d=="\"")    
    field<-scan(stream,"",1,sep=",",quote="\"",blank=FALSE)   
  else
    field<-scan(stream,"",1,sep=",",quote="",blank=FALSE)
  return(field)
}

假设上述约定,这足以解析如下

s<-file("example.csv",open="rt")
header<-readLines(s,1)
header<-scan(what="",text=header,sep=",")
line<-replicate(length(header),next_field(s))

setNames(as.data.frame(lapply(line,type.convert)),header)
类型 ID 名称 内容 回答 等级 来源 1 A 3 NA 我有逗号,哈!我有打开的双引号” A NA

但是,在实践中,您可能希望先将字段(引用每个字段)写回另一个文件,这样您就可以使用更正的格式 read.csv

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 2019-05-02
    相关资源
    最近更新 更多