[問題] 在字串中自動加入跳脫小牙籤
[問題類型]:
程式諮詢(我想用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://www.ptt.cc/bbs/R_Language/M.1612442887.A.835.html
※ 編輯: Mensch5566 (103.206.188.69 香港), 02/04/2021 20:50:08
推
02/05 02:13,
4年前
, 1F
02/05 02:13, 1F

→
02/05 02:14,
4年前
, 2F
02/05 02:14, 2F
→
02/05 02:16,
4年前
, 3F
02/05 02:16, 3F
→
02/05 02:16,
4年前
, 4F
02/05 02:16, 4F
→
02/05 15:09,
4年前
, 5F
02/05 15:09, 5F
→
02/05 19:22,
4年前
, 6F
02/05 19:22, 6F
我先重新解釋一下
平常是會先在網頁上調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
→
02/05 20:41,
4年前
, 7F
02/05 20:41, 7F
→
02/05 21:23,
4年前
, 8F
02/05 21:23, 8F
請看這張下圖
https://imgur.com/f5Jfdn8

因為將#前的雙引號視為結束,#之後的都變成註解,
所以送到console之後,顯示加號,表示命令未完成。
自訂函式的外層換作單引號之後,則因字串中還有單引號,
所以導致字串識別錯誤。
https://imgur.com/gT6TXmu

問題是在自訂函數接收字串就已經產生,
所以不管自訂函式裡面是用gsub或什麼辦法,他都沒辦法繼續下一步處理。
※ 編輯: Mensch5566 (103.206.188.69 香港), 02/05/2021 21:30:08
推
02/06 00:41,
4年前
, 9F
02/06 00:41, 9F
→
02/06 00:41,
4年前
, 10F
02/06 00:41, 10F
→
02/06 10:02,
4年前
, 11F
02/06 10:02, 11F
→
02/06 10:18,
4年前
, 12F
02/06 10:18, 12F
R_Language 近期熱門文章
PTT數位生活區 即時熱門文章