在R中读取包含引号的csv文件

3

我需要处理一个.csv文件,它看起来像这样:

"IDEA ID,""IDEA TITLE"",""VOTE VALUE"""
"56144,""Net Present Value PLUS (NPV+)"",1"
"56144,""Net Present Value PLUS (NPV+)"",1"

如果我使用read.csv,我得到的是一个只有一个变量的数据框。我需要一个有三列的数据框,其中每一列由逗号分隔。如何处理行首和行尾的引号?


1
请查看read.csvquote选项。 - user3710546
这可能是你需要的答案:https://dev59.com/lWQm5IYBdhLWcg3wswpv#17415028 - Ben
可能是重复的问题:read.csv警告'EOF within quoted string'阻止完整读取文件 - Nikolay Nenov
我不认为这些相关问题实际上会回答提问者的问题... - Ben Bolker
哎呀。这个CSV文件怎么会被搞得这么糟糕啊?你知道他们为什么要这样格式化吗? - MrFlick
2个回答

1

我认为在不先去掉初始和终止引号的情况下,没有简单的方法来实现这一点。如果您的系统上有sed(Unix [Linux/MacOS]或Windows+Cygwin?),那么

read.csv(pipe("sed -e 's/^\"//' -e 's/\"$//' qtest.csv"))

应该可以工作。否则

read.csv(text=gsub("(^\"|\"$)","",readLines("qtest.csv")))

对于大文件而言,这种方法的效率可能会稍低(在处理之前必须将整个文件读入内存),但应该可以在任何地方使用。

(也许有一种方法可以像第二个示例那样使用括号来进行 sed 的正则表达式,使其更加紧凑,但我已经厌倦了尝试弄清楚 所有反斜杠所属的位置。)


您是否也建议将字符串中间的连续双引号更改为单个双引号? - MrFlick
不确定您在这里指的是哪个字符串的中间?第二个示例中的正则表达式意味着“行首后跟双引号或双引号后跟行尾”。 - Ben Bolker
没错。你正在处理行末的那些数字(如果我读对了的话)。还有一个 ""IDEA TITLE""。这些引号不会搞砸事情吗? - MrFlick
@Fo:我之前也没想到,但是那些答案在这里(经过一点修改)确实可行。然而,我仍然认为我的基于sed的答案可能会更快,如果有sed的话... - Ben Bolker
@Fo.,你在重复自己吗? - Ben Bolker

0
我建议同时删除初始/终止引号并将连续的双引号转换为单个双引号。后者在某些字符串本身包含逗号的情况下至关重要,例如:
"1,""A mostly harmless string"",11"
"2,""Another mostly harmless string"",12"
"3,""These, commas, cause, trouble"",13"

在保留连续引号的情况下仅删除初始/终止引号,read.csv()函数会将最后一行中的所有逗号解释为值分隔符,从而产生6个变量。因此,完整的代码可能如下所示:

data.text <- readLines("fullofquotes.csv")  # Reads data from file into a character vector.
data.text <- gsub("^\"|\"$", "", data.text) # Removes initial/terminal quotes.
data.text <- gsub("\"\"", "\"", data.text)  # Replaces "" by ".
data <- read.csv(text=data.text, header=FALSE)

或者,当然,全部放在一行中

data <- read.csv(text=gsub("\"\"", "\"", gsub("^\"|\"$", "", readLines("fullofquotes.csv", header=FALSE))))

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