Comparison of common data file formats in Mandarin
拿到資料檔案該怎麼開?各格式限制與注意事項
常見格式快速比較表
| 格式 | 階層性 | 人類易讀 | 筆數/容量限制 | 常見問題 |
|---|---|---|---|---|
| CSV | 無(表格式) | 高 | 格式本身無上限,取決於開啟軟體(Excel 約 104 萬列) | 中文亂碼、換行符號欄位值易錯位、數字型別被強制轉換(如電話號碼開頭 0 消失) |
| TSV | 無(表格式) | 高 | 同 CSV,格式本身無上限 | 與 CSV 相同,但可避免欄位值含逗號時的分隔誤判 |
| Excel | 無(表格式) | 高 | 理論上限 1,048,576 列 × 16,384 欄;單一儲存格文字上限 32,767 字;超過 10 萬筆操作易頓 | 長數字被轉成科學記號、特定字串誤判為日期 |
| JSON | 有 | 中 | 格式本身無筆數上限,瓶頸為讀取時須整檔載入記憶體 | 大檔案(如 250MB+)易記憶體不足;建議改用 JSONL 串流讀取 |
| SQLite | 無(關聯式) | 低(需工具開啟) | 理論上限 2⁶⁴ 筆,實際受資料庫檔案 281 TB 上限限制(約 2×10¹³ 筆) | 需透過資料庫工具讀寫,不利直接檢視 |
| Parquet | 無(欄式) | 低(需工具開啟) | 格式本身無理論筆數上限(以 Row Group 為單位,預設每組 100 萬筆,可有任意組數) | 實務瓶頸為硬碟空間,非格式限制;已有成功案例寫入 5~10 億筆 |
| SQL 檔 | 無 | 中 | 純文字格式本身無上限,限制來自匯入工具 | 檔案過大時文字編輯器易當機;不同資料庫引擎語法相容性問題 |
建議:
- 需要巢狀/自由格式欄位 → JSON(大量資料改 JSONL)
- 資料量超過百萬筆、只需搬移資料 → Parquet 或 CSV
- 需要還原完整資料庫結構(含關聯、索引) → SQL 或 SQLite
- 一般使用試算表軟體開啟操作 → CSV / Excel,如果要使用 CSV / Excel 顯示階層結構,在欄位名稱可透過分隔符號呈現,例如 aaa / bbb
常見資料格式與限制
1. CSV 檔案
CSV 檔案:不同欄位值用逗號間隔。 CSV 格式本身沒有筆數上限,限制來自開啟它的軟體。[1]
常見問題是 大部分人會使用 Microsoft Excel 開啟 CSV, (1) 中文亂碼:點選兩下發現中文亂碼,檔首需要額外加上 BOM 符號,或者改用匯入檔案方式,才不會遇到亂碼、(2) 如果欄位值包含換行符號的話,Excel 容易會出錯,導致明明是同一筆資料,卻出現在下一筆而出現欄位錯置的錯誤。(3) 資料類型強迫轉換:常見的問題是手機號碼的第一位號碼 0 被吃掉,因為被強制轉換成整數。
如果你拿到是包含換行符號欄位值的 CSV 檔案,則不建議使用 Excel,而是改用 LibreOffice Calc。
2. TSV 檔案
TSV 檔案:不同欄位值用定位鍵 (TAB) 間隔。如果欄位值包含逗號,可以改用 TSV 檔案。 TSV 與 CSV 同屬純文字格式,筆數上限同樣取決於開啟的軟體,格式本身無限制。
3. Excel 檔案
Excel 檔案:常見的檔案類型,但是儲存格文字長度與欄位數量都有上限:單一儲存格內的文字不能超過 32,767 字,而欄位數上限是 16,384 欄 [2]。其次雖然資料筆數理論上限是 1,048,576 筆(= 2²⁰),但如果筆數超過 10 萬筆,電腦操作 Excel 就會頓頓的,反而不方便分析。如果是舊版 Excel(2003 以前)允許的筆數更少,僅 65,536 筆(= 2¹⁶)× 256 欄。[3][4]
常見問題是 Excel 雖然方便但經常會把長數字(例如:訂單編號)自動轉成科學記號顯示[5],或把特定字串(如 1-2、MAR3)誤判為日期[6],造成資料遺失或資料錯誤。
4. JSON 檔案
JSON 檔案:適合複雜格式或者說自由風格的欄位定義。曾經拿到包含多筆資料,約 250 MB 檔案大小的 JSON 檔案。因為發生檔案讀取錯誤,需要額外切割檔案內容。 JSON 格式本身沒有筆數上限,瓶頸是讀取時必須將整個檔案載入記憶體,因此檔案愈大愈容易發生記憶體不足的錯誤。[7]
實務上建議不要將多筆資料寫在 JSON,而改成 JSONL,也就是 JSON 加上換行符號區別多筆資料。適合使用程式用串流方式逐行讀取,而不致於發生記憶體錯誤。
5. SQLite 或 Parquet 檔案
SQLite 或 Parquet 檔案:當資料量超過 Excel 筆數上限,可以考慮使用這兩種格式。
SQLite 每張資料表的理論筆數上限是 2⁶⁴ 筆(約 1.8 × 10¹⁹),但這個數字實際上不可能達到,因為資料庫檔案大小上限 281 TB 會先被遇到。在最大資料庫容量下,可儲存的筆數約為 2 × 10¹³ 筆(前提是沒有索引且每筆資料極小)。[8]
Parquet 沒有硬性的筆數上限。格式本身以 Row Group 為單位儲存資料。Row Group 是 Parquet 檔案內部的水平分割單位,每個 Row Group 包含一段連續的資料列,以欄位為單位分開存放——例如一個有 100 萬筆、10 個欄位的資料集,在一個 Row Group 裡會被切成 10 段欄位資料分別儲存,而非逐列存放。這樣的設計讓查詢時只需讀取需要的欄位,不必掃描整列,大幅提升讀取效率。每個 Row Group 預設上限為 100 萬筆,但一個檔案可以包含任意數量的 Row Group,因此整個檔案的筆數沒有理論上限 [9]。實務上已有人成功寫入 5 億~ 10 億筆資料[10],瓶頸通常是硬碟空間,而非格式本身。
6. SQL 檔案
SQL 檔案:關聯式資料庫的匯出格式,內容為多列的 SQL 語法(如 INSERT INTO ...),可直接匯入至資料庫。
SQL 檔案本身沒有筆數上限,格式本身只是純文字,限制同樣來自開啟或匯入它的工具。
常見問題是
- (1) 檔案過大:大量資料匯出後動輒數 GB,用文字編輯器開啟會導致當機或無回應。
- (2) 跨資料庫相容性:不同資料庫引擎(如 MySQL、PostgreSQL、SQLite)的 SQL 語法有差異,從 A 引擎匯出的 .sql 檔案,未必能直接匯入另一個引擎。可參考 從_MySQL_資料轉移至_MSSQL
如果只需要搬移資料而非還原完整資料庫結構,建議改用 CSV 或 Parquet,避免上述相容性問題。
References
- ↑ Row Zero — CSV Row Limits by Spreadsheet: https://rowzero.com/blog/csv-row-limit
- ↑ Microsoft Support — Excel specifications and limits: https://support.microsoft.com/en-us/office/excel-specifications-and-limits-1672b34d-7043-467e-8e27-269d656771c3
- ↑ [Did You Know] Microsoft Excel has a Limit of Maximum 1,048,576 Rows and 16,384 Columns – AskVG https://www.askvg.com/did-you-know-microsoft-excel-has-a-limit-of-maximum-1048576-rows-and-16384-columns/
- ↑ What is the maximum allowed rows in a Microsoft Excel .xls or .xlsx - Super User
- ↑ 解決 Excel 長數字的最後一位歸零或出現科學記號的問題
- ↑ Excel功能出包,迫使科學家必須重新命名人類基因!現在這個Bug被修復了 | T客邦
- ↑ Quora — What is the practical limit on the size of a JSON message?: https://www.quora.com/What-is-the-practical-limit-on-the-size-of-a-JSON-message-for-an-internet-application
- ↑ SQLite 官方文件 — Implementation Limits For SQLite: https://sqlite.org/limits.html
- ↑ Apache arrow-rs GitHub issue #5797 — "Row groups are limited to 1M rows by default": https://github.com/apache/arrow-rs/issues/5797
- ↑ Andy Cutler — 10 Billion Rows: Parquet File Size and Distribution When using CETAS: https://www.serverlesssql.com/row-size-and-parquet-file-distribution/
Data factory flow
- 🔍 Data Collection: 1. How to extract content from websites
- 🧹 Data Cleaning: 2. Data cleaning, 3. Regular expression
- ⚙️ Data Processing: 4. Json encode and decode, 5. Convert between date and unix timestamp, 6. MySQL commands
- 📊 Data Analysis: 7. Data exploration
- 📤 Data Output: 8. Comparison of common data file formats, 9. Export MySQL query to Excel file, 10. Microsoft Excel
- 🔧 Troubleshooting: 11. Troubleshooting of MySQL errors