在R中读取带双引号的csv文件

12

假设我有一个看起来像这样的 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='')也不能正常工作,因为列没有被正确分隔。 - nathanesau
3个回答

10

fread 函数从 data.table 包可以很好地处理这个问题:

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       

不错啊。我自己应该想到这个的。 - David Arenburg

2
我不是很确定CSV文件的结构,但你说作者在内容下面的文本中逃避了逗号。
这样可以读取文本并以"结尾。
read.csv2("Test.csv", header = T,sep = ",", quote="")

1
这与仅使用 read.csv(text = text, quote="") 有何不同?虽然我猜这也无法提供所需的输出。 - David Arenburg
尝试了这个解决方案。列被移位了,所以无法得到期望的输出。 - Bamqf
实际上,使用这个解决方案,列也被分割了。 - David Arenburg

2

这不是有效的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)
}

Assuming the above convention, this sufficient to parse as follows

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)
  Type ID NAME           CONTENT                   RESPONSE GRADE SOURCE
1    A  3   NA I have comma, ha! I have open double quotes"     A     NA

However, in practice you might want to first write back the fields, quoting each, to another file, so you can just read.csv on the corrected format.


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