Замена двойных кавычек в R - PullRequest
3 голосов
/ 15 января 2011

Я пишу html-код в базу данных SQL с использованием RMySQL (но я полагаю, что моя проблема скорее является общим вопросом 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), который не работал должным образом, и решения, предложенные в посте Игнорировать escape-символы (обратную косую черту) в строках R , но я не могу заставить его работать.

Спасибо за ваше внимание, Филипп

Ответы [ 3 ]

4 голосов
/ 15 января 2011

Я вижу две проблемы с тем, что вы включили в свой вопрос.Первый выглядит как опечатка.После:

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 для вашей БД, он будет работать.

3 голосов
/ 15 января 2011

Попробуйте вставить этот запрос:

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 = ""))

Надеюсь, все будет хорошо!

3 голосов
/ 15 января 2011

Вы забыли избежать обратной косой черты в строках (я думаю, что это было бы в большинстве языков программирования, не уверен, что то же самое касается R).

gsub("\\\"", "\"", html)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...