11

考虑以下逗号分隔的文件。为简单起见,让它包含一行:


'I am quoted','so, can use comma inside - it is not separator here','but can\'t use escaped quote :=('

如果您尝试使用命令读取它

table <- read.csv(filename, header=FALSE)

该行将分为 4 个部分,因为该行包含 3 个逗号。事实上,我只想阅读 3 个部分,其中一个包含逗号本身。有报价旗来寻求帮助。我试过了:

table <- read.csv(filename, header=FALSE, quote="'")

但那是错误"incomplete final line found by readTableHeader on table"的。这是因为奇数(七)个引号引起的。

read.table()以及scan()有参数allowEscapes,但将其设置为TRUE无济于事。没关系,因为help(scan)您可以阅读:

被解释的转义符是控制字符 '\a, \b, \f, \n, \r, \t, \v', ... ...任何其他转义字符都被视为自身,包括反斜杠

请建议您如何阅读包含转义\'引号的此类引用的 csv 文件。

4

2 回答 2

5

一种可能性是使用readLines()按原样读取所有内容,然后将引号字符替换为其他内容,例如:

tt <- readLines("F:/temp/test.txt")
tt <- gsub("([^\\]|^)'","\\1\"",tt) # replace ' by "
tt <- gsub("\\\\","\\",tt) # get rid of the double escape due to readLines

这允许您使用 a 读取向量 tttextConnection

zz <- textConnection(tt)
read.csv(zz,header=F,quote="\"") # give text input
close(zz)

不是最漂亮的解决方案,但它可以工作(前提是文件中的某处没有 " 字符...)

于 2011-05-17T14:57:05.910 回答
1

read_delim从包readr可以处理转义引号,使用参数escape_doubleescape_backslash.

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

(注意旧版本的 readr 不支持正确引用 CSV 标头中的换行符:https ://github.com/tidyverse/readr/issues/784 )

于 2019-05-24T20:37:18.743 回答