我无法在R中读取包含如下所示行的文件。
"_:b5507F4C7x59005","Fabiana D\"atri"
有什么想法吗?我怎样才能使read.table明白“这是引用的逃避?”
干杯, 亚历山大
答案 0 :(得分:6)
在我看来,read.table/read.csv
无法处理转义引号。
......但我认为我有一个(丑陋的)解决方案受到@nullglob的启发;
,
)测试文件看起来像这样(我添加了一个非字符串列以便测量):
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)
read_delim
可以使用参数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)
答案 5 :(得分:-1)
read.csv()
这应该没问题。看一下?read.csv
的帮助 - 指定引用的选项是quote = "...."
。但是,在这种情况下,可能会出现问题:read.csv()
似乎更喜欢看匹配的引号。
我使用read.table("sample.txt", header = FALSE, as.is = TRUE)
尝试使用sample.txt
中的文字,但它似乎有效。如果其他所有内容都因read.csv()
而失败,我倾向于备份到read.table()
并仔细指定参数。