CSV 轉 JSON 再轉回來,資料不會壞掉
CSV 是純文字表格:每行一筆紀錄,欄位之間以分隔符號隔開,通常是逗號。當欄位裡含有分隔符號、雙引號或換行時就會出錯,因為讀取的程式必須分辨哪些是結構、哪些是內容。請遵守引號規則、檢查分隔符號與標題列,並將開頭帶零的數字保留為文字。本文其餘部分說明一次轉換往返能保留什麼、無法保留什麼。
CSV 轉 JSON需要把 CSV 轉成 JSON,或反過來免費使用CSV 檔案究竟是什麼
CSV 並沒有單一的權威標準,但 RFC 4180 描述了常見的格式,多數讀取程式都遵循它。其核心規則可以用一份短清單說明:
- 每筆紀錄獨占一行,RFC 規定行尾為歸位字元加換行字元,即 CRLF。
- 欄位以逗號分隔。
- 含有逗號、雙引號或換行的欄位,要以雙引號括住。
- 在被引號括住的欄位內,雙引號要寫成兩個雙引號。
所以這列 1001,"Smith, Ann",02134 有三個欄位,因為引號內的逗號屬於內容。若一看到逗號就切開的分割程式,則會切出四個欄位。fixmint 的讀取器會套用這些規則:被引號括住的欄位可以包含分隔符號、換行與重複的雙引號,而未關閉的引號會回報其起始所在的行。
分隔符號為何會改變
逗號是 RFC 的預設值,但在逗號為小數點的地區(例如 1,5 表示一點五),試算表常會改用分號儲存 CSV。Tab 分隔的檔案(TSV)在多數資料中可避開衝突,因為文字裡很少出現定位字元。
「分隔符號」選單提供「自動」、「逗號」、「分號」、「Tab」與「直線符號」。「自動」會讀取前十行,統計引號之外每一種候選符號的出現次數,並挑選每行數量最一致的那一種。若自動判斷錯誤,請自行選擇分隔符號。
在 fixmint 中轉換
範例使用的是 CSV 轉 JSON 工具 的預設選項。
範例演示
貼上以下 CSV,並勾選「第一列是標題」:
id,name,zip,note
1001,"Smith, Ann",02134,"She said ""hi"""
1002,Bo,10001,"line one
line two"
在「轉換數字」關閉、「JSON 縮排」設為 2 個空格的情況下,工具會回傳:
[
{
"id": "1001",
"name": "Smith, Ann",
"zip": "02134",
"note": "She said \"hi\""
},
{
"id": "1002",
"name": "Bo",
"zip": "10001",
"note": "line one\nline two"
}
]
開啟「轉換數字」後,id 欄的數字與 10001 會變成數字,而 02134 仍保留為文字。
操作步驟
- 貼上 CSV,或拖放 .csv、.tsv、.txt 或 .json 檔案。
- 檢查「第一列是標題」、「分隔符號」與「轉換數字」。JSON 縮排可選 2 個空格、Tab 或「壓縮」。
- 複製結果,或下載為 .json。
把數字保留為文字
JSON 數字不能有開頭的零,所以 02134 不是有效的 JSON 數字。郵遞區號、電話號碼與商品代碼必須保留為文字,否則零會消失。開啟「轉換數字」時,工具會把 10001 轉為數字,但把 02134 保留為字串。此選項預設為關閉。它只會轉換以點作為小數點的值,因此分號檔案中的 1,5 會維持原樣。
長的識別碼也需要注意。執行多數瀏覽器內 JSON 處理的 JavaScript 會把數字存成 64 位元浮點數。整數只有到 9,007,199,254,740,991(即 2 的 53 次方減 1)時才能精確表示。數字 12345678901234567890 被 JavaScript 程式讀取時會變成 12345678901234567000。工具會照原樣寫出數字,但若程式用 JavaScript 解析這份 JSON,就會發生捨入。請將 ID 保留為字串。格式化 JSON 工具 也會原樣保留這類數字,並會說明保留了幾個。
巢狀 JSON 與轉回 CSV
CSV 是扁平的,JSON 則可以巢狀。將 JSON 轉為 CSV 時,會為所有物件中的每個鍵建立一個欄位,欄位順序為各鍵首次出現的順序。巢狀的物件或清單會以 JSON 文字放入儲存格,null 會變成空白儲存格,true 與 false 則以文字寫出。各列以 CRLF 連接,只有在欄位包含分隔符號、引號、換行,或前後有空格時,才會加上引號。
開頭為 [ 或 { 的輸入會被視為 JSON。切換按鈕可切換方向,標示為 CSV → JSON 或 JSON → CSV。在 JSON → CSV 方向中,輸出選項會顯示「分隔符號」選單與「給 Excel 用」選項。
轉換往返會遺失資訊。null 與空字串都會變成空白儲存格,巢狀結構也無法還原,因此若需要保留結構,請保留原始 JSON。
Excel、UTF-8 與位元組順序標記
CSV 檔案是位元組,讀取程式必須知道編碼。UTF-8 可以容納帶重音的字母與其他字母系統。位元組順序標記(BOM)是檔案開頭的三個位元組,用來標示檔案為 UTF-8。沒有 BOM 時,某些試算表程式會以本地的代碼頁讀取檔案,帶重音的字母就會變成怪字元。試算表在開啟 CSV 時,也常會把 02134 變成 2134。
「給 Excel 用」選項只會在下載的 CSV 中加入 BOM,不會加入複製的文字,並且只在 JSON → CSV 方向生效。讀取程式會移除輸入中的 BOM,因此已有 BOM 的檔案也能正常轉換。
特殊情況
- 列長不一致。 開啟標題時,較短的列會以空值補齊,較長的列則會將多出的值保留為 column_N。結果會回報有多少列與標題不同。
- 重複或空白的標題。 重複的名稱會加上 _2、_3 等後綴,空白名稱會變成 column_N。這些變更能避免兩個鍵互相覆蓋。
- 彎引號。 文書處理軟體產生的彎引號不是 CSV 的引號,因此像 “Smith, Ann” 這樣的欄位會在逗號處被切開。請先用修正貼上的文字處理,或依照彎引號指南所述的方法改為直引號。
- 引號內的換行。 跨越兩行的欄位仍是一筆紀錄,但刪除重複行會在每個換行處切開輸入,因此會把兩半視為不同的列。請轉為 JSON 並比對物件,或以人工檢查。此工具仍適用於每行一個值的清單。
- 大型檔案。 結果方塊只顯示前 100,000 個字元,但「複製」與下載會包含完整輸出。
- 無效的 JSON。 轉換器會回報錯誤所在的行與欄,並在字元下方標示插入符號。格式化 JSON 工具會說明常見的失誤,JSON 錯誤指南則更詳細地介紹。
多數 CSV 問題,在分隔符號真正造成影響之前,就已經由欄位前後多餘的空格、檔案中間的空白列,以及不一致使用的引號所造成。請先用CSV 清理工具整理,再進行轉換。
借助 AI 協助,由英文原文翻譯而成。
留言
還沒有留言,搶先留言吧。


