2011-05-17 60 views
9

请考虑以下以逗号分隔的文件。为简单起见让它包含一条线:如何阅读包含转义引号的引用文本


'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)原因可以读:

被解释的逃逸是所述控制字符 '\一个,\ B,\楼\ N,\ R,\吨,\ V', ... ... 任何其他逃脱 字符将被视为本身,包括反斜杠

请提出你会怎么看这种报价的CSV文件,内含逃脱\'报价。

+0

我明白你想要做什么,但很困惑你为什么要使用'read.csv()':这不是一个CSV文件,没有多列,它只是一个文本块,尽管引号。你说行是分开还是不行,为什么不用'readLines(...,n = 1)'?你必须表示它是包含转义引号的多行文本。 – smci 2016-09-22 04:27:45

回答

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 

这可以让你阅读载体TT在使用textConnection

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

不是最漂亮的解决方案,但它的工作原理(只要你不将文件中有“字的地方偏离航向......)

+2

如果你用'''替换'\'',那么'read.csv'会处理它。 – Marek 2011-05-17 15:14:55

+0

@Marek:我并不完全关注。我应该在哪里取而代之以获得正确的输出? – 2011-05-17 15:37:09

+3

我的意思是'tt < - readLines(file); tt < - gsub(“\\\\'”,“''”,tt); read.csv(textConnection(tt),header = FALSE,quote =“'”)导致双引号被正确读取(参见'?scan' - > Details - > quotes)。 – Marek 2011-05-17 21:11:35