把純文字清單的每一行都加上引號,是每位開發人員都熟悉的小麻煩,而且會依目標格式的不同而適用三種已發布的規則。一位同事在聊天室貼了五十個 ID,而你需要把它們轉成 JSON 陣列、SQL IN 子句,或加上引號的 CSV 列,才能開始使用。在清單加上引號,重點其實不是引號字元本身;而是要用哪一種引號、用什麼分隔符連接、以及資料中內嵌的引號該如何跳脫——而且這三個選擇會隨目標是 JavaScript、SQL 主控台或試算表匯入而有所不同。為每一行加上引號工具會一次完成這三件事,套用每種格式實際要求的跳脫規則:JSON 適用 RFC 8259(內嵌的雙引號會變成反斜線跳脫,陣列結尾不會有尾隨逗號);SQL 適用由 PostgreSQL 與 SQLite 所記載的 ISO 字串常值規則(單引號要寫兩次,不使用反斜線);CSV 則適用 RFC 4180(欄位以雙引號包起,內嵌的雙引號要寫兩次,整列放在同一行)。所有處理都在瀏覽器本地執行,輸入上限為一百萬字元,你貼上的清單不會離開這個頁面。

how to add words to a quote
為 JSON、SQL 與 CSV 將每一行加上引號

當「為每一行加上引號」才是真正的任務

「add words to a quote」這個說法通常指的是一種寫作慣例:使用方括號 [ ] 在他人引文中插入說明文字,或使用省略號標記被省略的內容。那是文法工作,不是格式化工作,加引號工具也幫不上忙。本文討論的是開發人員的工作:把一份純粹的值清單,轉成語法正確的程式碼或資料片段,以便讓剖析器、查詢引擎或匯入工具能夠使用。

這項任務在實際工作中常見的原因:隊友在聊天室貼了一份訂單 ID 清單,而你需要在 WHERE id IN (...) 中查詢它們。產品經理用純文字傳來功能名稱,而你需要把它們做成 JSON fixture 以供單元測試使用。從某份試算表匯出的資料,必須先變成單一列加上引號的 CSV,下游的匯入作業才會接受。以 SQL 常值維護一份環境電子郵件白名單,會比用設定檔更容易維護。設定檔中的 i18n 字串表或功能開關清單,每個項目都需要用對稱的引號包起來。在這些情境中,那些行就是你想要「加進引號」的「字」——只是這裡所謂的「引號」指的是 JSON 字串常值、SQL 常值或 CSV 欄位,而不是包圍某段文字的引號。

三種跳脫規則一覽

把清單加上引號最困難的部分不是包引號本身,而是跳脫。每一種常見的目標格式都會定義自己的規則,說明當資料本身含有引號字元時該怎麼處理,而這三種規則彼此不同。工具中的預設值直接編入了每種格式的已發布規則,你不必去記它們的差異。

預設包覆字元內嵌引號的跳脫規則引用的標準
JSON 陣列雙引號 " "反斜線跳脫:" 會變成 \"RFC 8259
SQL IN 子句單引號 ' '單引號寫兩次:it's 會變成 it''sISO / PostgreSQL / SQLite
CSV 列雙引號 " "雙引號寫兩次:say "hi" 會變成 "say ""hi"""RFC 4180
反引號(樣板字面值)反引號 ` `反斜線同時跳脫反引號與 ${ 內插開頭JavaScript 樣板字面值

同一份輸入在每種預設下會產生明顯不同的輸出,因為跳脫方式不同。一行內容 she said "hi" 經過 JSON 預設處理會變成 "she said \"hi\"";經過 SQL 預設處理則原封不動地包在單引號裡(雙引號只是資料,不是分隔符);經過 CSV 預設處理則變成 "she said ""hi"""。這些輸出彼此不能互換。選擇符合你貼上目標的預設,跳脫自然就會是正確的。

如何用三個步驟為每一行加上引號

對於一份已經整理乾淨的清單——沒有空行、沒有頭尾空白、沒有雜亂的逗號——不管目標格式為何,工作流程都一樣。每個步驟如下所示。

  1. 把清單貼到輸入框,每行一個項目。
  2. 點選符合目標的預設:JSON 陣列、SQL IN 子句、CSV 列,或純引號(另有獨立的反引號選項,用於 JavaScript 樣板字面值)。
  3. 如果目標需要的設定超出預設的預設值,可以再微調引號樣式、分隔符或跳脫方式,然後複製可直接貼上的結果。

用一個簡短的範例讓這三個步驟更具體。從這份輸入開始,每行一個項目:

widget-Awidget-Bwidget-C

點選 JSON 陣列預設會產生:

[ "widget-A", "widget-B", "widget-C" ]

請注意最後一行後面並沒有殘留的逗號,這正是結果可直接貼上的原因:在多數剖析器中,含有尾隨逗號的 JSON 陣列依 RFC 8259 屬於語法錯誤。狀態列會回報處理了幾行,因此可以與輸入進行數量核對。同樣的三個步驟也適用於 SQL 與 CSV 預設——唯一改變的是預設所編入的已發布規則。

微調引號樣式、分隔符與跳脫方式

預設涵蓋了常見情況,但每一個選項也另外開放為獨立控制項。引號樣式可以設為單引號、雙引號、反引號或無(最後一個選項不會為行加上引號,適合只需要以逗號分隔欄位的場合)。分隔符也可以調整,預設會配合所選的預設——JSON 與 CSV 用逗號,SQL IN 則是用括號包起來的逗號——還有個切換開關可決定最後一行是否加上尾隨分隔符。這個切換開關預設為關閉,因為在多數情境中,JSON 的尾隨逗號或 IN (...) 內的尾隨元素都是語法錯誤。當目標系統明確需要尾隨分隔符時(某些 CSV 變體、某些自製的 SQL 處理流程),就應該把它打開。

跳脫功能可以完全關閉,當資料已經事先跳脫過、只想單純加上引號時非常實用。略過空行與逐行修剪是兩個獨立的切換開關:開啟修剪時會去掉每行頭尾的非必要空白而不更動內容;開啟略過空行時,輸出中就不會出現介於項目之間的空項。這些控制項讓工具能在不離開頁面的情況下,配合目標所需的細部變體。

為什麼再跑一次工具會把所有內容包兩層引號

有個行為值得一開始就知道:把工具自己的輸出再貼回去,會再把結果包一層引號。原本是 widget-A 的一行,跑一次之後變成 "widget-A",跑兩次之後變成 "\"widget-A\""。這是設計如此,不是 bug——引號工具無法判斷輸入中既有的引號是屬於內容的一部分,還是應該保留的包覆,所以它只會做唯一保險的動作:再包一層。如果需要更換預設、跳脫方式或其他控制項,請從原本的純粹清單開始,不要在輸出上再跑一次。把這個工具當成把純粹行轉成可直接貼上程式碼的一次性轉換器,能讓工作流程可預期,也能避開重複包引號的陷阱。

先清理再加引號

從聊天室或信件收到的清單大多無法直接加上引號:常常含有重複、多餘空白、區段之間的空行,或順序不一致。最乾淨的工作流程是先將清單標準化,再加上引號。本站的 移除重複行工具會在保留首次出現的前提下合併重複項目;比較兩份清單工具則能確認兩個版本之間改了哪些內容;接著再對清理過、去重過的輸入執行一次加引號動作。比起先加引號再清理,先清理再把結果送進 SQL 查詢或 JSON fixture 不容易出錯,因為加好的引號、逗號與括號會讓清理工具更難套用於輸出。

延伸閱讀:AutoCAD 行尾樣式:將文字斷行轉換為 \n。

延伸閱讀:文字去重:移除重複行的實用指南。