13

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

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

任何的想法?我怎样才能让 read.table 明白 \" 是引号的转义?

干杯,亚历山大

4

6 回答 6

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
于 2011-08-15T18:10:57.807 回答
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 环境......

于 2012-11-23T10:05:57.303 回答
2

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

您可以考虑使用 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,所以你可能已经尝试过这个。不管怎样,祝你好运!

于 2011-08-15T16:38:49.377 回答
1

通过设置参数,我能够让您的示例正常工作quote

> read.csv('test.csv',quote="'",head=FALSE)
                   V1                  V2
1 "_:b5507F4C7x59005" "Fabiana D\\"atri" 
2 "_:b5507F4C7x59005" "Fabiana D\\"atri" 
于 2011-08-15T15:42:49.693 回答
0

read_delim从包readr可以处理转义和双引号,使用参数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)
于 2019-05-24T20:23:21.153 回答
-2

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

我在 , 中尝试了同样的方法read.table("sample.txt", header = FALSE, as.is = TRUE),你的文本在 中sample.txt,它似乎有效。当所有其他方法都失败时read.csv(),我倾向于备份read.table()并仔细指定参数。

于 2011-08-15T15:33:52.340 回答