用R中的双引号替换转义的双引号

Posted

技术标签:

【中文标题】用R中的双引号替换转义的双引号【英文标题】:Replacing escaped double quotes by double quotes in R 【发布时间】:2011-06-09 11:52:48 【问题描述】:

我正在使用 Rmysql 向 SQL 数据库编写一些 html 代码(但我想我的问题是一个通用的 R 问题,而不是与 SQL 或 RMySQL 真正相关的问题)。所以我正在尝试这样的事情:

con <- RMySQL(...) # some connection    
html <- "<div style='text-align: center; font-family: Arial;'><span style='font-size: 14pt;'>Some text without any tricky symbols.</span></div>"    
    query <- c('INSERT INTO table (htmlfield) VALUES (\"', html, '"') 
    dbSendQuery(con,paste(query, collapse = ""))

麻烦的是,R的粘贴会将单引号中的双引号(即'"')替换为转义序列\",即:

> paste(query, collapse = "")
[1] "INSERT INTO table (htmlfield) VALUES (\"<div style='text-align: center; font-family: Arial;'><span style='font-size: 14pt;'>Some text without any tricky symbols.</span></div>\""

如果我将向量查询中的单引号更改为双引号,并将 html 中的单引号更改为双引号,则问题出在字符串 html 的一侧,此后 html 中的双引号被替换为转义序列。

处理转义字符替换的最简单方法是什么?

我尝试了gsub('\\\"','"',html),它没有按预期工作,而Ignore escape characters (backslashes) in R strings 帖子中建议的解决方案却无法正常工作。

感谢您的关注,菲利普

【问题讨论】:

我怀疑你对字符串和它的表示感到困惑。开始here启蒙。 那就学习this paste 不会将 " 替换为 \",它是 print 插入它们的方法。你的例子应该工作。你得到什么错误? @VitoshKa 正如我在回答中提到的那样,query 字符串中缺少尾随 ),我冒昧地说,这就是它不起作用的原因。我怀疑这里发生了几件事,一个错字导致 SQL 语法错误,然后@Philipp 注意到 printed 表示中的转义 " 并将两个和两个放在一起想出五。 【参考方案1】:

我发现您在问题中包含的内容存在两个问题。第一个看起来像一个错字。之后:

html <- "<div style='text-align: center; font-family: Arial;'><span style='font-size: 14pt;'>Some text without any tricky symbols.</span></div>"   

你有:

query <- c('INSERT INTO table (htmlfield) VALUES (\"', html, '"')
                                                  ^^^^^^^^^^^^^^^

请注意,您转义了一个字符串,但没有转义另一个。你不需要逃避它们,但如果你这样做也没关系。您还指'")' 表示最后一个字符串,我怀疑这是您遇到的错误的真正来源。 paste 而不是 c 在这里更有用。如果我结合这些,我们得到:

query <- paste('INSERT INTO table (htmlfield) VALUES ("', html, '")', sep = "")

我们可以直接使用:

dbSendQuery(con, query)

第二个问题,也是很多人都会遇到的问题,是将对象的印刷表示与对象本身混淆。如果我们打印query,我们会看到:

> query
[1] "INSERT INTO table (htmlfield) VALUES (\"<div style='text-align: center; font-family: Arial;'><span style='font-size: 14pt;'>Some text without any tricky symbols.</span></div>\")"

字符串的打印表示总是用"" 双引号括起来,因此内部" 需要转义。您要查看的是实际字符串。我们可以使用catwriteLines 来做到这一点——我更喜欢后者,因为它会自动将"\n" 添加到字符串的末尾:

> writeLines(query)
INSERT INTO table (htmlfield) VALUES ("<div style='text-align: center; font-family: Arial;'><span style='font-size: 14pt;'>Some text without any tricky symbols.</span></div>")

注意" 现在是如何转义的。那就是将由数据库服务器执行的 SQL。如果这对您的数据库来说是有效的 SQL,那么它将起作用。

【讨论】:

【参考方案2】:

您忘记在字符串中转义反斜杠本身(我认为大多数编程语言都会出现这种情况,不确定 R 是否也是如此)。

gsub("\\\"", "\"", html)

【讨论】:

我认为你的想法非常有道理,R 没有......也许它与 R 打印字符串的方式有关。 如果你打印这个字符串你会看到什么? "Replacing \\\" with \"!" 我认为这种方式行不通,因为print 总是会逃脱",而sub 也有类似的行为(或者至少我从未以这种方式成功过)。 catwrite 会起作用,但这只有在您想将连接的字符串写入文件时才有用。 @nightcracker: catwrite 对字符串不做任何事情只显示它们,而 printgsub 和其他人转换和格式化输入,这就是为什么引号被转义为我认为,并且不在首先引用的函数中。 @daroczig 您将对象的打印表示与对象混淆了。考虑print("\\\\\n")cat("\\\\\n")。在这两个中,我 have 来转义反斜杠,但 print 向我显示了内部表示,cat 显示了我想要的实际字符串。此外,print 不会像您描述的那样做任何事情,它只是返回对象(在这种情况下),它是 cat 等从 R 表示转换为 所需的字符串.【参考方案3】:

尝试粘贴此查询:

query <- c('INSERT INTO table (htmlfield) VALUES (\'', html, '\'') 

唯一的变化是引号:\' 而不是 "

总的来说:

html <- "<div style='text-align: center; font-family: Arial;'><span style='font-size: 14pt;'>Some text without any tricky symbols.</span></div>"    
query <- c('INSERT INTO table (htmlfield) VALUES (\'', html, '\'')
dbSendQuery(con, paste(query, collapse = ""))

希望一切顺利!

【讨论】:

这只是在回避问题——真正的问题;不区分字符串的打印表示和实际表示之一。

以上是关于用R中的双引号替换转义的双引号的主要内容,如果未能解决你的问题,请参考以下文章

正确转义 CSV 中的双引号

shell中的   中文和英文   双引号

Java - '\' 未用于转义字符串中的双引号“

Oracle中的单引号怎么转义

存储过程中执行sql语句时如何转义双引号?

vba 如何去掉返回结果两端的双引号?