将包含嵌入式引号的csv文件读入R中

时间:2014-07-09 06:53:23

标签: r csv statistics double-quotes

我必须使用这样的.csv文件:

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

如果我使用read.csv,我会获得一个带有一个变量的数据框。我需要的是一个包含三列的数据框,其中列以逗号分隔。如何在行的开头和行的末尾处理引号?

2 个答案:

答案 0 :(得分:0)

我不认为在没有首先剥离初始和终端引号的情况下,这将是一种简单的方法。如果您的系统上有sed(Unix [Linux / MacOS]或Windows + Cygwin?),那么

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

应该有效。否则

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

对于大文件来说效率稍差(你必须在处理它之前阅读整个文件),但是应该可以在任何地方使用。

(可能有一种方法可以使用第二个示例使用的括号以相同,更紧凑的形式为sed执行正则表达式,但我厌倦了尝试整理where all the backslashes belonged 。)

答案 1 :(得分: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))))