用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启蒙。 那就学习thispaste
不会将 " 替换为 \",它是 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>\")"
字符串的打印表示总是用""
双引号括起来,因此内部"
需要转义。您要查看的是实际字符串。我们可以使用cat
或writeLines
来做到这一点——我更喜欢后者,因为它会自动将"\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
也有类似的行为(或者至少我从未以这种方式成功过)。 cat
和 write
会起作用,但这只有在您想将连接的字符串写入文件时才有用。
@nightcracker: cat
和 write
对字符串不做任何事情只显示它们,而 print
、gsub
和其他人转换和格式化输入,这就是为什么引号被转义为我认为,并且不在首先引用的函数中。
@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中的双引号替换转义的双引号的主要内容,如果未能解决你的问题,请参考以下文章