- Các định dạng được cho là “vượt trội” để thay thế CSV thường xuyên được giới thiệu, nhưng phần lớn dựa trên những so sánh thiên lệch và bỏ qua các điểm mạnh thực sự của CSV
- Bài viết này không nhằm nói rằng CSV là hoàn hảo, mà muốn làm nổi bật những ưu điểm bị đánh giá thấp của nó
- Đi ngược lại bầu không khí coi việc ghét CSV là thứ gì đó trông thật ngầu, bài viết nhắc lại giá trị thật sự của CSV
1. CSV cực kỳ đơn giản
- Định nghĩa của CSV đúng như tên gọi: “các giá trị được phân tách bằng dấu phẩy”
- Các hàng được phân tách bằng xuống dòng, các cột bằng dấu phẩy
- Nếu giá trị chứa dấu phẩy hoặc xuống dòng thì được bao bằng dấu ngoặc kép, còn bản thân dấu ngoặc kép được biểu diễn bằng ngoặc kép đôi
- Không cần đặc tả phức tạp, ai cũng có thể hiểu và օգտագործել một cách trực quan
- Tuy vậy, để phân tích chính xác thì vẫn nên dùng parser CSV chuyên dụng
2. CSV là một ý tưởng mang tính tập thể
- Không có chủ sở hữu, không bị tư hữu hóa
- Có RFC 4180, nhưng đa số chỉ xem đó là tài liệu tham khảo
- Đây là một định dạng tự do dựa trên các quy tắc chung được các lập trình viên trên toàn thế giới ngầm chia sẻ
3. CSV là văn bản
- Giống JSON, YAML, XML, đây là định dạng văn bản thuần mà con người có thể đọc được
- Có thể mở bằng bất kỳ trình soạn thảo văn bản nào và xem nội dung mà không cần công cụ riêng
- Cũng có thể tự do lựa chọn cách mã hóa
4. CSV được tối ưu cho streaming
- Vì có cấu trúc đọc từng dòng nên mức tiêu thụ bộ nhớ rất thấp
- Chỉ với đoạn mã đơn giản cũng có thể xử lý vài GB dữ liệu chỉ bằng vài KB bộ nhớ
- Các định dạng hướng cột như Parquet khó xử lý theo kiểu streaming và cần buffering phức tạp
- Điểm bất lợi là ngay cả khi chỉ muốn xem một cột cụ thể, bạn vẫn phải đọc toàn bộ hàng
5. CSV rất dễ nối thêm dữ liệu
- Việc mở tệp ở chế độ append(
a+) và thêm hàng mới vào cuối là cực kỳ dễ
- Ngược lại, các định dạng hướng cột như Parquet khiến việc thêm hàng trở nên kém hiệu quả và phức tạp
6. CSV hỗ trợ kiểu động
- Không có kiểu cố định nên có thể diễn giải dữ liệu một cách linh hoạt
- Ví dụ: JavaScript không thể biểu diễn chính xác số nguyên 64-bit, nhưng CSV có thể được dùng mà không bị ràng buộc bởi hạn chế đó
- Đây là lợi thế về khả năng tương thích giữa các ngôn ngữ và tính linh hoạt
- Tuy nhiên, nếu diễn giải sai thì có thể phát sinh lỗi → cần thận trọng khi sử dụng
- Khi cần hiệu năng cao, cũng có thể xử lý trực tiếp ở mức nhị phân mà không giải mã văn bản
7. CSV ngắn gọn
- Header chỉ tồn tại ở đầu tệp nên hầu như không có sự lặp lại về định dạng
- JSON và XML có overhead lớn do lặp lại khóa
- Cách biểu diễn chuỗi vốn đã gọn, và overhead của chính định dạng (dấu phẩy, dấu ngoặc kép, v.v.) cũng rất nhỏ
8. CSV bị đảo ngược vẫn hợp lệ
- CSV vẫn là CSV hợp lệ ngay cả khi đảo ngược theo từng byte
- Điều này có được nhờ cách escape bằng ngoặc kép đôi, vốn là một cơ chế escape dạng palindrome
- Nhờ đặc tính này, có thể đọc phần cuối của tệp CSV rất hiệu quả
- Ví dụ: khi khôi phục một tiến trình bị gián đoạn, có thể chỉ đọc vài dòng cuối của tệp để khởi động lại
9. Excel ghét CSV
- Nếu Excel thấy một định dạng bất tiện, thì biết đâu đó lại là dấu hiệu cho thấy bạn đang đi đúng hướng
3 bình luận
Đơn giản là tốt nhất!
Tệ hơn mới là tốt hơn!
Ý kiến Hacker News
Lý do thích các tệp CSV và INI là vì chúng đơn giản, dựa trên văn bản, không có kiểu dữ liệu được mã hóa trong định dạng và chỉ được cấu thành từ chuỗi
CSV thanh lịch nhưng có một khuyết điểm chí mạng - dấu ngoặc kép tạo ra hiệu ứng “phi cục bộ”
Điểm hay nhất của CSV là ai cũng có thể viết một parser trong 30 phút
Người thích CSV chắc chưa từng bị yêu cầu xử lý việc ngăn chặn CSV injection trong môi trường doanh nghiệp
Có nhiều lý do để thích CSV
Gần đây tôi đang phát triển một giải pháp dựa trên Raspberry Pi
Điều kém thú vị ở CSV là các parser và serializer viết vội thường lặp lại những lỗi phổ biến khi xử lý dấu ngoặc kép
Nếu đây thực sự là một bức thư tình, hẳn nó đã được viết bằng định dạng CSV
Phản biện chống lại JSON không mấy thuyết phục
Là người thích các định dạng hiện đại, khi phân vân tôi dùng CSV hoặc JSONL
grepvà hỗ trợ streaming