CSV 是什麼
CSV(Comma-Separated Values)是以半形逗號(,)分隔各欄位值的純文字檔案格式。它用行與列的二维結構來表示試算表或資料庫中常見的資料表,是最簡單、最通用的文字資料格式之一。
CSV 從 1970 年代開始使用,歷史悠久,但沒有單一具有強制力的標準規格。IETF 的 RFC 4180 整理了廣泛使用的慣例,但其定位是 Informational(資訊性文件),而非正式標準。即便如此,Excel、Google 試算表、資料庫匯出、系統間資料交換等場景中,CSV 都已被當作事實標準使用。
你手邊有 CSV 想轉成 JSON 的話,直接貼到 CSV 轉 JSON 就能取得結構化結果。不需要註冊或上傳檔案,所有處理都在瀏覽器內完成。
CSV 的基本結構
行與列(記錄與欄位)
CSV 檔案中,每一行代表一筆記錄(row),逗號分隔的各項目代表一個欄位(column)。
王小明,30,台北
李婷,25,高雄
陳大偉,35,台中
標題列(欄位名稱)
檔案第一列通常作為欄位名稱(header)。有了標題列,每個欄位的資料代表什麼意義就清楚了。
name,age,city
王小明,30,台北
李婷,25,高雄
陳大偉,35,台中
標題列在規格上不是必須的,但實務上幾乎都會包含。沒有標題列的話,第三欄到底是城市還是部門名稱,僅看資料本身無法判斷。
引號與跳脫規則
當欄位值包含逗號或換行符號時,必須用雙引號(")將整個欄位包裹起來。引號內的逗號會被視為資料本身,而非欄位分隔符。這是 RFC 4180 定義的核心規則。
name,comment
王小明,"興趣是閱讀、跑步"
李婷,"台北市大安區
羅斯福路 123 號"
如果欄位值本身包含雙引號,則將雙引號重複兩次("")作為跳脫。
title,note
商品A,"尺寸是""M""號"
解析後的結果為:尺寸是"M"號。不遵守這套規則寫入資料,解析器會把欄位切分錯位或報出語法錯誤。
有些 CSV 寫入器會對所有欄位都加上引號,這雖然安全但檔案會稍大一些。其他寫入器只在必要時才加引號。兩種做法都合法。
分隔符號的變體
雖然名稱叫「Comma-Separated Values」,實際上也有使用其他分隔符號的檔案被泛稱為 CSV。
| 格式 | 分隔符號 | 常見使用場景 | 副檔名 |
|---|---|---|---|
| CSV | 半形逗號 , | 最常見,Excel、試算表、一般系統預設 | .csv |
| TSV | 制表符 \t | 生物資訊、部分資料庫匯出 | .tsv |
| 分號分隔 | 分號 ; | 小數點使用逗號的歐洲地區(如德語版 Excel) | .csv |
| 直線分隔 | 直線 | | 舊有系統 | .csv .txt |
大部分 CSV 解析器都允許指定分隔符號,所以這些差異通常容易處理。
全形逗號的陷阱
台灣和香港的使用者尤其需要注意這一點:輸入全形逗號「,」而非半形逗號「,」。
全形逗號(U+FF0C)在 CSV 中不是分隔符號,它會被當成欄位值的一部分。如果從試算表或文字編輯器匯出時使用了全形逗號,整行資料會變成單一欄位,解析結果完全錯亂。
姓名,年齡,城市
王小明,30,台北
上面的檔案中,逗號全是全形的。CSV 解析器會把「姓名,年齡,城市」當成一個欄位、整行當成一個欄位值。正確寫法應該是:
name,age,city
王小明,30,台北
檢查方法:用文字編輯器開啟檔案,確認逗號是半形(,)還是全形(,)。如果看到全形逗號,替換為半形才能正常解析。
編碼問題
CSV 檔案打開後出現亂碼,幾乎都是編碼問題。CSV 格式本身不儲存編碼資訊(RFC 4180 也沒有規定編碼),讀取端必須自行推測或由使用者指定。
Big5 與 UTF-8 的混用
繁體中文環境中,編碼問題特別突出。主要涉及三種情況:
-
Big5(CP950):繁體中文 Windows 系統和較舊版 Excel 預設使用 Big5 編碼。從這些環境匯出的 CSV,如果被 UTF-8 的網頁應用程式或 Linux 伺服器讀取,繁體字就會變成亂碼。
-
UTF-8(無 BOM):現代開發環境的預設編碼。但如果用沒有 BOM 的 UTF-8 檔案被預設設定的 Windows 版 Excel 打開,Excel 會以系統預設編碼(通常為 Big5)來解碼,同樣出現亂碼。
-
UTF-8 BOM(UTF-8-SIG):檔案開頭加上 BOM(Byte Order Mark,
EF BB BF三個位元組)來標示此檔案為 UTF-8。Excel 看到 BOM 就會正確識別為 UTF-8 並正常顯示繁體字。但 Google 試算表和許多 Web API 會把 BOM 當成一個多餘的不可見字符,導致第一欄的欄位名稱前面多出一個看不見的標記。
實務上的建議:在團隊內統一使用 UTF-8,並明確規定 BOM 的有無。或者在處理檔案前主動轉換編碼。
Python 的 pandas 讀取含 BOM 的 CSV 時,指定 encoding="utf-8-sig" 就能自動去除 BOM 並正確讀取:
import pandas as pd
# 讀取 UTF-8 BOM 檔案
df = pd.read_csv("data.csv", encoding="utf-8-sig")
# 讀取 Big5(Windows 繁體 Excel 預設值)檔案
# df = pd.read_csv("data_excel.csv", encoding="big5")
Excel 打開 CSV 亂碼的對策
用繁體中文版 Excel 打開 UTF-8 編碼的 CSV 檔案時,最常見的症狀就是亂碼。以下是對策:
- 儲存時選擇正確格式:Excel 另存新檔時,選擇「CSV UTF-8(逗號分隔)」而非一般的「CSV(逗號分隔)」。前者會加上 BOM,確保下次打開時編碼正確。
- 匯入時指定編碼:使用「資料」>「從文字檔取得資料」功能,在匯入精靈中手動指定編碼為 UTF-8,可以避開自動偵測失敗的問題。
- 先用文字編輯器轉碼:用 VS Code 或其他編輯器打開檔案,將編碼從 Big5 轉換為 UTF-8(含 BOM),再存回 CSV。
CSV 與試算表
CSV 是試算表和程式之間最常見的橋樑。
Excel 中按「另存新檔」並選擇 CSV 格式即可產出 CSV 檔案;反過來說,雙擊 CSV 檔案也會啟動 Excel 並以表格形式顯示。
但要注意 Excel 會自動進行型別推斷:像員工編號 007 這種前導零會被當成數字而變成 7;1-2 這種字串可能被自動轉為日期格式。如果你的資料包含前導零或看似日期的字串,匯入 Excel 前要先用文字格式鎖定這些欄位。
Google 試算表也可以透過「檔案」>「下載」>「逗號分隔的值 (.csv)」來匯入和匯出 CSV。
CSV 轉 JSON
CSV 的扁平結構在需要嵌套或型別資訊時會不夠用。轉為 JSON 後,每行變成一個物件,標題列變成鍵名,各欄位的意義就明確了。
[
{
"name": "王小明",
"age": "30",
"city": "台北"
},
{
"name": "李婷",
"age": "25",
"city": "高雄"
}
]
注意 age 仍然是字串("30" 而非 30)。因為 CSV 沒有型別資訊,轉換器無法判斷 30 應該是數字還是字串。部分轉換器提供型別推斷選項,但預設值通常都是字串。
REST API 的請求主體幾乎都要求 JSON 格式。把試算表匯出的 CSV 轉成 JSON,就能直接當作 API 的請求資料使用。JavaScript 的 Array.map() 和 Array.filter() 處理 JSON 也比處理原始 CSV 文字方便得多。
用 CSV 轉 JSON 工具,貼上 CSV 文字就能立刻得到結構化的 JSON 輸出。所有運算都在瀏覽器的 WebAssembly 和 JavaScript 引擎上執行,資料不會送到外部伺服器。
總結
- CSV 是以逗號分隔欄位、以換行分隔行的最簡單的二维表格文字格式
- 包含逗號、換行或雙引號的欄位必須用雙引號包裹,雙引號本身用重複("")跳脫
- 台灣和香港環境中,Big5 與 UTF-8 的混用、BOM 的有無、全形逗號的誤用是最常見的三個亂碼成因
- Excel 的型別推斷會悄悄修改前導零和日期格式,匯入前要留意
- 需要結構化或 API 整合時,用 CSV 轉 JSON 轉成 JSON 是最直接的解法

