如何阅读包含转义引号的引用文本

Posted

技术标签:

【中文标题】如何阅读包含转义引号的引用文本【英文标题】:How to read quoted text containing escaped quotes 【发布时间】:2011-08-27 07:11:57 【问题描述】:

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


'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 文件,其中包含转义的 \' 引号。

【问题讨论】:

我理解你想要做什么,但我很困惑你为什么要使用 read.csv():这不是一个 CSV 文件,没有多列,它只是一个块文本,尽管带有引号。您是说行是否分开,为什么不直接使用readLines(...,n=1)?您必须表示它是包含转义引号的多行文本。 我发现这真的很烦人。 Write.table 将输出带有引号的字符串作为转义的\" 但 read.table 无法解释这些。如果 R 无法读取,为什么要默认以这种格式编写它们?! 【参考方案1】:

一种可能性是使用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

这允许您使用 textConnection 读取向量 tt

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

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

【讨论】:

@Marek :我没有完全关注。我应该在哪里替换它以获得正确的输出? 我的意思是 tt &lt;- readLines(file); tt &lt;- gsub("\\\\'","''",tt); read.csv(textConnection(tt),header=FALSE,quote="'") 导致双引号被正确读取(参见 ?scan -> 详细信息 -> 引号)。 显然这适用于"引用的文件,也适用于tt &lt;- gsub("\\\\\"","\"\"",tt); 虽然此解决方案适用于小文件,但对于较大的文件,它会变得非常慢并且使用大量内存。流式解决方案(在进入表之前仅在内存中保留一行文件)会更好,但我(还)不知道该怎么做。 @rakensi 您可以使用 readLines() 以块的形式读取文件并处理这些块,但是 R 中涉及大文件或数据集的任何解决方案都会变慢并且会占用大量内存。 R 在设计上并不是对内存最友好的语言。【参考方案2】:

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)

【讨论】:

以上是关于如何阅读包含转义引号的引用文本的主要内容,如果未能解决你的问题,请参考以下文章

带有转义引号的引用字符串的正则表达式

将数据从 SQL Server Express 导出到 CSV(需要引用和转义)

ColdFusion/Javascript 转义单引号

Visual Studio 调试器可以显示未引用/未转义的字符串吗?

使用 TextFieldParser 处理包含未转义双引号的字段

在 MySQL 表中同时插入和更新转义字符、单引号和双引号