作者Mensch5566 (Double Green)
看板R_Language
标题[问题] 在字串中自动加入跳脱小牙签
时间Thu Feb 4 20:48:02 2021
[问题类型]:
程式谘询(我想用R 做某件事情,但是我不知道要怎麽用R 写出来)
[软体熟悉度]:
入门(写过其他程式,只是对语法不熟悉)
[问题叙述]:
工作的时候要透过POST向公司的资料库发送SQL请求。
以往请求的时候大概是这样
https://imgur.com/PRyLi2e
最近恰好有张资料表的栏位开头是一堆 # 和 $,
导致要正常传送的话,必须手动在每个引号前面加入小牙签 \ 跳脱。
像是这样
https://imgur.com/U63m8Qs
问题是SQL如果长的话,想避免自己手动加入小牙签,不然会累死。
所以正在尝试各种方法让SQL最终发送出去的时候,都能够透过代码自动加上该有的小牙签。
目前找到最方便的办法是透过 r"()",
但是紧接着遇到下一个问题,就是Rstudio编辑器会把#当作备注,
导致脚本上面後面的东西都会乱掉,一堆unexpected token。
像是这样
https://imgur.com/BD9vYFQ
上面这个不换行还好,下面的abc <- c('abc') 不会有问题。
但如果SQL一坨的时候需要换行,#会被识别为备注,
就会变成这样
https://imgur.com/gYgYCxa
主要诉求:
1. 想将SQL语句自动化加入小牙签,并且能夹在body送出去。
2. 使用r"()"的话,让编辑器正常识别括号。
附上脚本(POST的url是公司的,脚本上只能拿掉了,不好意思):
https://drive.google.com/file/d/1memSyxbYRqq0s-uXabhE2-PAyig3bgZA/view?usp=sharing
想请问有经验的大大们,有没有什麽办法能解决?
不见得要用r”()”也无所谓。
多谢了!Orz
[环境叙述]:
R version 4.0.0 (2020-04-24)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Catalina 10.15.5
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 103.206.188.69 (香港)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1612442887.A.835.html
※ 编辑: Mensch5566 (103.206.188.69 香港), 02/04/2021 20:50:08
2F:→ locka: 原po想要做到的是这样吗? 02/05 02:14
3F:→ locka: 我的想法是在funtion里面多一步,加一个gsub利用正则表达式 02/05 02:16
4F:→ locka: 寻找特殊字元并加入backslash(小牙签) 02/05 02:16
5F:→ andrew43: 如果是单、双引号交错使用呢? 02/05 15:09
6F:→ Mensch5566: 先感谢各位耐心帮忙,我问题可能没说清楚,我重新解释 02/05 19:22
我先重新解释一下
平常是会先在网页上调SQL,大概像这样:
https://imgur.com/ggBi82u
如上图,红箭头是框栏位名的双引号,蓝箭头是框值的单引号,两者不能替换。
也就是说,R透过POST发送出去的字串,在加上小牙签之前,要跟图里的长得一模一样。
R要创建字串的时候,
双引号可以括住单引号:
https://imgur.com/G6YWB1H
单引号可以括住双引号:
https://imgur.com/iiX2q45
但是没办法同时框住单双引号:
https://imgur.com/naoKVok
所以必须根据c()里面最外层的引号,加入小牙签。
如果最外层是双引号,则字串里的双引号前必须加入小牙签:
https://imgur.com/IkMNYcH
如果最外层是单引号,则字串里的单引号前必须加入小牙签:
https://imgur.com/UlEStXF
如此一来才能让R识别,创建出字串。
话说回来,因为会先在网页上写SQL,确认语句正确後,
会把整条SQL复制并贴到POST的自订函式里面。
但这样就会产生上面提到的,没办法同时框住单双引号。
不管外层用单或双引号,都没办法创建字串,因为里面单双引号都有。
https://imgur.com/DovVWtB
这时候唯一的办法,就是根据最外层的引号,把字串中的引号前面加上小牙签,
例如最外层是使用双引号,则把里面的双引号都加上小牙签,
像是这样:
https://imgur.com/73qXquC
上图中可以看到c函式有正确建立字串,就表示POST函式也没有问题,
确实发送後也返回了200表示成功。
然而,现在的问题是,当网页上复制过来的SQL语句很长的时候,
还得自己一个一个手动加上小牙签,如果漏了就还得慢慢找。
因此想问,有没有什麽办法,可以在自订函式这边,
让贴过来的SQL就直接能处理,即加上应有的小牙签,并且POST出去。
目前找到最快的方法是使用r"()"
像这样:
https://imgur.com/BGHLNL5
r"()" 用这前置字元确实可以说是完美了。
但偏偏r"()"现在Rstudio编辑器上面的判断有点怪,
Rsutiod会将括号中的第一个双引号当作结束,
所以在编辑器上面看会变成这样,#後面都变注解:
https://imgur.com/zuIkyDp
虽然後半段被判断为注解,但实际上R还是能识别。
但是真正写的时候肯定会换行,所以整个脚本就会有一堆unexpected token,
虽然代码还是能跑,但变得非常乱,像是这样:
https://imgur.com/Xh9sWcT
所以想问问除了r"()",还有没有更好的办法。
跪谢惹Orz
※ 编辑: Mensch5566 (103.206.188.69 香港), 02/05/2021 19:23:49
7F:→ locka: 所以是在双引号前面加反斜线,那一样可以用gsub做不是吗? 02/05 20:41
8F:→ Mensch5566: 不是的,问题不在自订函数里面。 02/05 21:23
请看这张下图
https://imgur.com/f5Jfdn8
因为将#前的双引号视为结束,#之後的都变成注解,
所以送到console之後,显示加号,表示命令未完成。
自订函式的外层换作单引号之後,则因字串中还有单引号,
所以导致字串识别错误。
https://imgur.com/gT6TXmu
问题是在自订函数接收字串就已经产生,
所以不管自订函式里面是用gsub或什麽办法,他都没办法继续下一步处理。
※ 编辑: Mensch5566 (103.206.188.69 香港), 02/05/2021 21:30:08
9F:推 andrew43: 可以和rstudio提报issue。编辑器应该可以再聪明一点才 02/06 00:41
10F:→ andrew43: 是。 02/06 00:41
11F:→ Mensch5566: 好的,准备回报去!感谢协助Orz 02/06 10:02
12F:→ Mensch5566: 感谢提醒,一直纠结代码,更新Rstudio,新版已解决 02/06 10:18