我无法读取包含如下行的文件 R 中的行。
"_:b5507F4C7x59005","Fabiana D\"atri"
任何的想法?我怎样才能让 read.table 明白 \" 是引号的转义?
干杯,亚历山大
我无法读取包含如下行的文件 R 中的行。
"_:b5507F4C7x59005","Fabiana D\"atri"
任何的想法?我怎样才能让 read.table 明白 \" 是引号的转义?
干杯,亚历山大
在我看来,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
在 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 环境......
我提前道歉,这不是更详细 - 我正处于代码紧缩的中间。
您可以考虑使用 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,所以你可能已经尝试过这个。不管怎样,祝你好运!
通过设置参数,我能够让您的示例正常工作quote
:
> read.csv('test.csv',quote="'",head=FALSE)
V1 V2
1 "_:b5507F4C7x59005" "Fabiana D\\"atri"
2 "_:b5507F4C7x59005" "Fabiana D\\"atri"
read_delim
从包readr可以处理转义和双引号,使用参数escape_double
和escape_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)
这应该没问题read.csv()
。查看帮助?read.csv
- 指定报价的选项是quote = "...."
. 但是,在这种情况下,可能会出现问题:它似乎read.csv()
更喜欢看到匹配的引号。
我在 , 中尝试了同样的方法read.table("sample.txt", header = FALSE, as.is = TRUE)
,你的文本在 中sample.txt
,它似乎有效。当所有其他方法都失败时read.csv()
,我倾向于备份read.table()
并仔细指定参数。