Dữ liệu

CSV, JSON và YAML

Ba định dạng chứa phần lớn dữ liệu có cấu trúc của thế giới. Chuyển đổi giữa chúng thì dễ; chuyển đổi mà không âm thầm làm hỏng điều gì đó thì cần chút cẩn thận.

Đăng ngày

Mỗi định dạng dùng để làm gì

CSV là một bảng: hàng và cột, không gì khác. Nó đọc được ở mọi nơi, cực kỳ nhỏ gọn, và không thể diễn đạt bất cứ thứ gì lồng nhau. JSON là một cây — đối tượng trong mảng trong đối tượng — và là thứ mà hầu hết mọi API web sử dụng. YAML diễn đạt cùng cấu trúc như JSON nhưng dùng thụt lề thay cho dấu ngoặc nhọn, khiến con người đọc và chỉnh sửa dễ chịu hơn nhiều, và là lý do các tệp cấu hình ngày càng chuyển sang dùng nó.

Cái bẫy ép kiểu dữ liệu

Đây là điều thực sự khiến mọi người tốn tiền. CSV chỉ chứa văn bản — không có cách nào đánh dấu một giá trị là số, ngày hay chuỗi. Vì vậy các công cụ chuyển đổi phải đoán, và những phỏng đoán đó thường sai:

  • Một mã bưu chính như 01234 trở thành số 1234, mất đi số 0 đứng đầu.
  • Một mã sản phẩm như 1-2 trở thành một ngày.
  • Một số tài khoản dài trở thành số thực dấu phẩy động và mất các chữ số cuối.
  • NA, nghĩa là Bắc Mỹ, trở thành “không có sẵn”.

Mỗi trường hợp trên đều diễn ra âm thầm. Đó là lý do một phép chuyển CSV sang JSON cẩn thận nên giữ mọi giá trị là chuỗi và để bạn quyết định — đúng là điều mà công cụ chuyển đổi của trang này cố tình làm, dù thoạt nhìn có vẻ câu nệ.

Điều gì không sống sót khi chuyển sang CSV

Cấu trúc lồng nhau. Một mảng JSON gồm các đối tượng phẳng trở thành một bảng gọn gàng. Ngay khi một giá trị tự nó là đối tượng hoặc mảng, không còn cột nào để đặt nó vào. Các lựa chọn là làm phẳng bằng các khóa ghép, tuần tự hóa phần lồng nhau trở lại thành văn bản trong ô, hoặc bỏ nó đi — và bỏ đi một cách âm thầm là tệ nhất trong ba cách. Ghi lại thành văn bản JSON trong ô ít nhất vẫn giúp dữ liệu có thể khôi phục.

Những điểm sắc nhọn của YAML

YAML dễ đọc nhưng cũng dễ viết sai một cách bất thường.

  • Thụt lề chính là cấu trúc, và không cho phép dùng tab. Một khoảng trắng đặt sai làm thay đổi ý nghĩa thay vì gây ra lỗi.
  • Một số từ trần là giá trị logic. Trong YAML cũ hơn, y, n, on, off, yes và no đều được phân tích là đúng hoặc sai — nên một cột quốc gia chứa NO cho Na Uy sẽ trở thành false. Hãy đặt chúng trong dấu ngoặc kép.
  • Chú thích biến mất khi chuyển sang JSON, vì JSON không có cách nào biểu diễn chúng.

Chuyển đi chuyển lại không được đảm bảo

Chuyển JSON sang YAML rồi chuyển lại thường trả về đúng cái bạn bắt đầu. Chuyển CSV sang JSON rồi chuyển lại thường thì không: kiểu dấu ngoặc kép, thứ tự cột với các bản ghi có hình dạng khác nhau, và cách biểu diễn giá trị rỗng đều là các lựa chọn, và các công cụ khác nhau chọn khác nhau. Nếu việc chuyển đi chuyển lại phải chính xác, hãy kiểm tra thay vì giả định.

Để chuyển giữa chúng: chuyển CSV sang JSON, chuyển JSON sang CSV, hoặc chuyển JSON sang YAML — và hãy kiểm tra kết quả, vì việc chuyển đi chuyển lại không phải lúc nào cũng chính xác.