若要使用逗號到欄位分隔符的輸出格式,使其能夠承受內嵌的逗號與雙引號,請將每個值都以雙引號包起來,並將值內出現的引號加倍——這就是 Column to Comma Separated List 工具預設採用的 CSV 引號規則。逗號是純文字資料交換中最常見的欄位分隔符,因為它只有一個位元組、每個鍵盤上都有,而且每個試算表、資料庫和程式語言都能解析它。問題在於,一旦某個值包含字面上的逗號或字面上的雙引號,天真的連接方式——value1, value2, value3——會在不知不覺中破壞結構。"Smith, Jane" 會變成兩個欄位。像 6" bolt 這樣的測量值會變成斷裂的詞元。修正方法就是將每個值加上引號、將每個內嵌引號加倍,並輸出一行可預測的結果。這正是該工具所產生的輸出——逐行貼上每個值、套用選擇性的修剪與去重、對每個值加上 CSV 引號,然後將它們連接成一個序列,準備送入任何可識別 CSV 的目的地。整個轉換過程都在瀏覽器中執行,因此貼上的清單不會離開這個頁面。

comma to column separator
Comma to Column Separator: Build Quote-Safe Output

為何逗號成為預設的欄位分隔符

在純文字檔案中,欄位分隔符是位於同一筆記錄中兩個欄位之間的字元。當分隔符是逗號時,該檔案就是 CSV——逗號分隔值。這個格式可以追溯到 1970 年代初期,作為在主機、之後是試算表、再之後是網路之間傳遞表格資料的一種簡單、低負擔的方式。RFC 4180 正式制定了現今大多數解析器所遵循的規則:記錄以換行符分隔,欄位以逗號分隔,而任何包含逗號、雙引號或換行符的欄位都必須用雙引號包起來,並將每個內嵌的雙引號加倍。

遵循這些規則正是讓輸出能夠安全往返的原因。寫成 "Smith, Jane" 的欄位讀回時會是單一值 Smith, Jane,而不是兩個值。寫成 "6"" bolt" 的欄位讀回時會是 6" bolt。欄位分隔符保持可見——每個值的結尾都是帶引號的邊界加上一個逗號——因此下游解析器永遠不需要猜測一個欄位在哪裡結束、下一個欄位在哪裡開始。

當內嵌的逗號與引號破壞天真的序列時

破壞逗號分隔序列最快的方法,就是用逗號加空格連接並跳過引號。對於簡短、乾淨的標籤來說這樣可行。但在某個值包含逗號或引號字元的瞬間,這種方式就失敗了。試想試算表中含有三個項目的欄位:

  • Smith, Jane
  • 6" bolt
  • Acme, Inc.

天真的連接會產生 Smith, Jane, 6" bolt, Acme, Inc.,看起來很整齊,但實際上現在包含五個邏輯欄位而非三個。姓名和公司名稱被切開了,而 6" bolt 中裸露的 " 會讓那些期望引號欄位的解析器踩到雷。該工具產生的 CSV 加引號輸出為 "Smith, Jane","6"" bolt","Acme, Inc.",任何 RFC 4180 解析器都能精確重建。三個欄位、三個逗號、三個加引號的邊界。

對於標籤、姓名、地址、產品代碼和網域清單來說這很重要——任何值來自現實世界來源而非受控制詞彙表的地方。將每個值都視為需要保護,比逐列決定是否需要加引號更可預測,因為無聲的損壞比多餘的雙引號更難察覺。

將垂直清單轉換為引號安全的逗號序列

Column to Comma Separated List 工具接受每行一個值、套用您選擇的清理選項,並輸出一行 CSV 加引號的結果。對於從試算表欄位作業的讀者來說,無論來源是 Excel、Google 試算表或純文字檔案,都可以套用相同的模式——複製不含標題的一個欄位、貼上,然後讓工具完成連接。關於 Excel 端的詳細操作步驟,請參見 Excel Column to Comma Separated List in 3 Steps

  1. 每行貼上一個值。 從來源複製單一欄位(不含標題),並貼到輸入框中。該工具接受 Windows 的 CRLF、較舊的僅 carriage-return,以及 Unix 的 line-feed 分隔符,因此從常見編輯器和試算表儲存格複製的清單都能被一致地處理。
  2. 決定應如何清理行。 開啟修剪前後空白以移除每行的開頭和結尾空白——這對於以空格填補的試算格很有用。開啟移除空白行以在修剪後丟棄空白的列。只有在精確的重複對您的目的地沒有意義時,才開啟移除重複的值,因為去重是區分大小寫的,Apple 與 apple 會視為不同。
  3. 保持 CSV 引號開啟並點擊 Convert column。 為每個值加上引號是預設啟用的,會產生 "value1","value2","value3" 形式的輸出,且每個內嵌的雙引號都會加倍。關閉引號則會產生更簡單的「逗號加空格」序列,這在散文寫作中很方便,但只要某個值包含逗號或引號就會產生歧義。
  4. 將顯示的計數與您的來源進行比對。 該工具會顯示輸出中值的精確數量。如果您以 47 個不重複、非空白的列開始,結果卻顯示 42,表示您的某個清理選項移除了比預期更多的內容,您應該在複製前重新檢查。
  5. 檢查標點敏感的項目。 開啟輸出並確認包含內部逗號和引號的值是否如您預期顯示——"Smith, Jane" 而非 Smith, Jane,以及 "6"" bolt" 而非 6" bolt。這一步能在錯誤擴散到更大的檔案之前先抓到它們。
  6. 將結果複製到目的地。 使用 Copy result 按鈕並貼到您的 CSV 檔案、標籤欄位、設定檔,或任何逗號分隔序列應該存在的地方。

在貼上之前驗證輸出

最有用的一個驗證步驟就是值計數。該工具會公開輸出值的精確數量,因此您可以將其與來源欄位的列數進行比對。不相符通常意味著某個清理選項比預期更積極——移除重複項目時把您想保留的列合併了,或是修剪時把一個正當以空格開頭的值給剝掉了。

第二個驗證是針對兩個會破壞天真連接的標點模式進行視覺掃描:值內的逗號以及值內的雙引號。如果您的清單包含其中任一,加引號的輸出應該會顯示該值以雙引號包起來,且內部的雙引號已加倍。如果您看到未加引號的值內有裸露的逗號,表示引號功能關閉了,或者該值被意外地分割了。

第三個驗證是盡可能進行往返測試。將輸出貼到 CSV 解析器或試算表的匯入功能中,檢查每列的欄位數是否符合您的預期。該工具的計數、掃描與往返三步驟,是在您將逗號到欄位分隔符的序列提交到實際目的地之前,確認其結構是否健全的最快方法。

當逗號序列不夠用時

逗號分隔的輸出是為可識別 CSV 的目的地所設計的。一些常見的目的地有自己的規則,千篇一律的貼上會在不知不覺中破壞它們:

  • SQL 字串與 IN 子句。 SQL 字串常值使用單引號,識別符可能需要引號或方括號,而綁定參數是處理值的預設安全方式。該工具不會推斷資料庫方言。
  • JSON 陣列。 JSON 字串以雙引號包起來,且引號、反斜線與控制字元需要以反斜線跳脫。CSV 風格的雙引號並不是有效的 JSON。
  • Shell 命令列引數。 Shell 穿透需要 bash、cmd 或 PowerShell 特定的引號規則,再加上對空格與特殊字元的跳脫。
  • URL 查詢參數。 查詢字串中的值需要百分比編碼,而非 CSV 引號。

如果您的目的地屬於上述其中一類,請使用專為該目標打造的格式化工具,而不是把逗號分隔序列當作萬用的互換格式。對於中等的、以行為單位的集合——標籤、姓名、識別符、網域、產品代碼——也就是使用輸出的人能控制目的地並能驗證其語法的情況,CSV 加引號的序列是較安全的形式。

開啟引號 vs. 關閉引號

這兩種輸出模式解決不同的問題。下表摘要說明它們各自如何處理通常會造成麻煩的值。

情境 CSV 引號開啟(預設) CSV 引號關閉
輸出形式 "value1","value2","value3" value1, value2, value3
值包含逗號,例如 Smith, Jane 維持單一欄位:"Smith, Jane" 被逗號分割成兩個欄位
值包含引號,例如 6" bolt 維持單一欄位:"6"" bolt" 產生裸露的 ",破壞許多解析器
空值或僅含空白字元的值 以 "" 的形式可見 不可見——塌縮進分隔符中
最佳目的地 任何可識別 CSV 的匯入工具、試算表或文字檔 散文、口語化清單、受控制詞彙的標籤

預設保持引號開啟,原因與格式化工具預設使用明確分隔符相同:一個看起來整齊、卻會在真實資料上悄悄損壞的輸出,比一個稍微冗長但能正確解析的輸出更糟糕。如果您確定目的地不需要引號,且想要較短的形式,可以切換關閉引號——但請記住,一旦某個值包含逗號、雙引號,甚至是一個開頭的空格,那個較短的形式就會開始遺失資訊。

任何貼上作業都適用兩個實際的限制。該工具最多接受 500,000 個輸入字元和 10,000 行,因此超過任一上限的單次貼上會在拖慢頁面之前就被拒絕。對於較大的集合,請將來源切割成多個區塊,或在您自己的機器上使用串流工具。轉換發生在瀏覽器分頁中,輸入內容不會被上傳,且重新載入頁面會清除工作文字——當清單包含任何敏感內容時,這些特性非常實用。

如果您正在權衡各種選項,Online Grocery List Maker: Build a Private Checklist 對此有詳細介紹。