如何读取“在R中使用read.table双引号转义的值

时间:2011-08-15 15:12:05

标签: r csv escaping double-quotes

我无法在R中读取包含如下所示行的文件。

"_:b5507F4C7x59005","Fabiana D\"atri"

有什么想法吗?我怎样才能使read.table明白“这是引用的逃避?”

干杯, 亚历山大

6 个答案:

答案 0 :(得分:6)

在我看来,read.table/read.csv 无法处理转义引号。

......但我认为我有一个(丑陋的)解决方案受到@nullglob的启发;

  • 首先阅读没有引号字符的文件。 (这不会处理@Ben Bolker指出的嵌入式,
  • 然后浏览字符串列并删除引号:

测试文件看起来像这样(我添加了一个非字符串列以便测量):

13,"foo","Fab D\"atri","bar"
21,"foo2","Fab D\"atri2","bar2"

以下是代码:

# Generate test file
writeLines(c("13,\"foo\",\"Fab D\\\"atri\",\"bar\"",
             "21,\"foo2\",\"Fab D\\\"atri2\",\"bar2\"" ), "foo.txt")

# Read ignoring quotes
tbl <- read.table("foo.txt", as.is=TRUE, quote='', sep=',', header=FALSE, row.names=NULL)

# Go through and cleanup    
for (i in seq_len(NCOL(tbl))) {
    if (is.character(tbl[[i]])) {
        x <- tbl[[i]]
        x <- substr(x, 2, nchar(x)-1) # Remove surrounding quotes
        tbl[[i]] <- gsub('\\\\"', '"', x) # Unescape quotes
    }
}

输出正确:

> tbl
  V1   V2          V3   V4
1 13  foo  Fab D"atri  bar
2 21 foo2 Fab D"atri2 bar2

答案 1 :(得分:4)

在Linux / Unix上(或在带有cygwin或GnuWin32的Windows上),您可以使用sed将转义的双引号\"转换为双引号"",这可以很好地处理read.csv

p <- pipe(paste0('sed \'s/\\\\"/""/g\' "', FILENAME, '"'))
d <- read.csv(p, ...)
rm(p)

实际上,以下sed命令用于预处理CSV输入:

sed 's/\\"/""/g' file.csv

我不称之为美丽,但至少你不必离开R环境......

答案 2 :(得分:1)

我提前道歉,这不是更详细 - 我正处于代码紧缩的中间。

您可以考虑使用scan()函数。我创建了一个简单的示例文件“sample.csv”,其中包含:

V1,V2
"_:b5507F4C7x59005","Fabiana D\"atri"

两种快速的可能性(输出已注释,因此您可以复制粘贴到命令行):

test <- scan("sample.csv", sep=",", what='character',allowEscapes=TRUE)
## Read 4 items
test
##[1] "V1"                "V2"                "_:b5507F4C7x59005"
##[4] "Fabiana D\\atri\n"

test <- scan("sample.csv", sep=",", what='character',comment.char="\\")
## Read 4 items
test
## [1] "V1"                "V2"                "_:b5507F4C7x59005"
## [4] "Fabiana D\\atri\n"

你可能需要多玩一点才能得到你想要的东西。我看到你已经提到过writeLines,所以你可能已经尝试过了。无论哪种方式,祝你好运!

答案 3 :(得分:0)

我可以通过设置quote参数来使您的eample工作:

> read.csv('test.csv',quote="'",head=FALSE)
                   V1                  V2
1 "_:b5507F4C7x59005" "Fabiana D\\"atri" 
2 "_:b5507F4C7x59005" "Fabiana D\\"atri" 

答案 4 :(得分:0)

reader 中的

read_delim可以使用参数escape_doubleescape_backslash处理转义和双引号的双引号。

例如,如果我们的文件通过将引号加倍来对引号进行转义:

"quote""","hello"
1,2

然后我们使用

read_delim(file, delim=',')  # default escape_backslash=FALSE, escape_double=TRUE

如果我们的文件使用反斜杠转引号:

"quote\"","hello"
1,2

我们使用

read_delim(file, delim=',', escape_double=FALSE, escape_backslash=TRUE)

答案 5 :(得分:-1)

read.csv()这应该没问题。看一下?read.csv的帮助 - 指定引用的选项是quote = "...."。但是,在这种情况下,可能会出现问题:read.csv()似乎更喜欢看匹配的引号。

我使用read.table("sample.txt", header = FALSE, as.is = TRUE)尝试使用sample.txt中的文字,但它似乎有效。如果其他所有内容都因read.csv()而失败,我倾向于备份到read.table()并仔细指定参数。