2011-08-15 104 views
11

我无法读取包含类似下面的R.如何阅读”双引号逃脱值函数read.table R中

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

任何想法行的文件?如何能我让read.table明白“是报价的逃脱?

干杯, 亚历山大

+1

我可能是很好的补充您的样品中一两行额外的,所以你没有得到的答案是只为你的单行上班...... – Tommy

+0

参见[如何读取包含转义引号引用文本(http://stackoverflow.com/questions/6032296/how-to-read-quoted-text-containing-escaped-quotes)在R中使用readLines的解决方案。 – jnas

回答

5

在我看来,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 
+0

在我看来,比预期的更多的工作。但@Tommy解决方案的作品!谢谢! –

0

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

我试过与read.table("sample.txt", header = FALSE, as.is = TRUE)相同,你的文字在sample.txt,它似乎工作。当所有其他都失败read.csv(),我倾向于备份到read.table()并仔细指定参数。

+0

不,它不起作用,尝试稍微复杂一些,比如:'writeLines(c(“\”foo \“,\”Fab D \\“atri \”,\“bar2 \”“,”\ “foo2的\”,\ “的Fab d \\\” atri2 \ “\ ”BAR2 \“”), “foo.txt的”)'... – Tommy

+0

请记住,你原来的输出,从R角度来看,只是每行1个字符串,而不是一堆单独引用的字符串。如果你想要在文件中引用整个东西,那么你需要周围的引号。 – Iterator

+0

'read.table'之后,我得到'a $ V2'输出'[1]“,\”Fab“,\”Fab“'这是不正确的。 ...如果你在文本编辑器中打开“foo.txt”,你会发现它包含了OP所说的字符串。 – Tommy

0

我能得到您的eample通过设置quote论证工作:提前

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

如果在该领域的一个逗号此解决方案将无法工作... –

+0

我想加入'allowEscapes = TRUE'可以帮助,但它似乎没有。 –

+0

...这种作品除非文件中有单引号。但所有的字符串都以双引号结束(并且逃脱的引号仍然被转义),所以需要更多的处理... – Tommy

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,所以你可能已经试过了。无论哪种方式,祝你好运!

+0

'allowEscapes'也是'read.csv'和'read.table'的参数。 –

3

在Linux/Unix(或在Windows上使用Cygwin或的GnuWin32),你可以使用sed到逃脱双引号\"转换为加倍双引号""可以很好地read.csv处理:

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

有效地,以下sed命令用于预处理CSV输入:

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

我不叫这个美丽的,但至少你不必离开R环境...