[問題] 在字串中自動加入跳脫小牙籤

看板R_Language作者 (Double Green)時間3年前 (2021/02/04 20:48), 3年前編輯推噓2(2010)
留言12則, 3人參與, 3年前最新討論串1/1
[問題類型]: 程式諮詢(我想用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, 3年前 , 1F

02/05 02:14, 3年前 , 2F
原po想要做到的是這樣嗎?
02/05 02:14, 2F

02/05 02:16, 3年前 , 3F
我的想法是在funtion裡面多一步,加一個gsub利用正則表達式
02/05 02:16, 3F

02/05 02:16, 3年前 , 4F
尋找特殊字元並加入backslash(小牙籤)
02/05 02:16, 4F

02/05 15:09, 3年前 , 5F
如果是單、雙引號交錯使用呢?
02/05 15:09, 5F

02/05 19:22, 3年前 , 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, 3年前 , 7F
所以是在雙引號前面加反斜線,那一樣可以用gsub做不是嗎?
02/05 20:41, 7F

02/05 21:23, 3年前 , 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, 3年前 , 9F
可以和rstudio提報issue。編輯器應該可以再聰明一點才
02/06 00:41, 9F

02/06 00:41, 3年前 , 10F
是。
02/06 00:41, 10F

02/06 10:02, 3年前 , 11F
好的,準備回報去!感謝協助Orz
02/06 10:02, 11F

02/06 10:18, 3年前 , 12F
感謝提醒,一直糾結代碼,更新Rstudio,新版已解決
02/06 10:18, 12F
文章代碼(AID): #1W6-q7Wr (R_Language)