Để chuyển CSV sang JSON an toàn, hãy dùng bộ chuyển đổi tuân theo chuẩn CSV về dấu nháy và xuống dòng, tự nhận ra dấu phân cách và giữ mọi giá trị dưới dạng chữ trừ khi bạn yêu cầu số. Phần lớn dữ liệu hỏng không phải do việc chuyển đổi. Nó hỏng vì CSV bị mở bằng bảng tính trước, và bảng tính làm mất số 0 đầu cũng như làm tròn số dài trước khi bộ chuyển đổi kịp thấy. Bài này cho thấy một phép chuyển đúng trông thế nào, năm thứ hay sai, và cách thử đi một vòng rồi quay lại trên chính tệp của bạn.
Một phép chuyển đúng trông thế nào
CSV trông đơn giản, mỗi dòng một bản ghi với dấu phẩy ngăn cách, nhưng một giá trị được phép chứa dấu phẩy, dấu nháy, thậm chí cả xuống dòng, miễn là được bao trong dấu nháy. Một dấu nháy nằm trong giá trị được viết hai lần. Đây là một tệp nhỏ có đủ những thứ đó, cộng thêm một mã có số 0 đầu và một số rất dài:
id,name,zip,note,balance
007,"Nguyen, An",01234,"He said ""hi""",12345678901234567890
008,Binh,70000,"line one
line two",1.50Chuyển bằng công cụ chuyển đổi CSV và JSON với thiết lập mặc định, ta được:
[
{
"id": "007",
"name": "Nguyen, An",
"zip": "01234",
"note": "He said \"hi\"",
"balance": "12345678901234567890"
},
{
"id": "008",
"name": "Binh",
"zip": "70000",
"note": "line one\nline two",
"balance": "1.50"
}
]Dấu phẩy trong "Nguyen, An" không tách giá trị, hai dấu nháy kép trở thành một dấu nháy, xuống dòng trong ô trở thành \n, và không thứ gì trông giống số bị đụng đến: 007 và 01234 giữ nguyên số 0, và số dư 20 chữ số còn nguyên vẹn.
Năm thứ hay sai
1. Số 0 đầu biến mất
Mã bưu chính, số điện thoại, mã sản phẩm và các mã định danh như 007 là chữ mà tình cờ gồm toàn chữ số. Bộ chuyển đổi đoán "đây là số" sẽ biến 01234 thành 1234. Bộ chuyển đổi ở đây giữ mọi giá trị dưới dạng chữ theo mặc định. Nếu bạn chọn "Chuyển số, true/false và ô trống", các số thuần như 70000 thành số JSON, nhưng giá trị có số 0 đầu vẫn là chữ.
2. Số dài mất các chữ số cuối
JavaScript, và vì thế hầu hết công cụ làm việc với JSON, lưu số dưới dạng số dấu phẩy động 64 bit. Số nguyên chỉ chính xác đến 9.007.199.254.740.991, một số 16 chữ số. Vượt qua đó chúng bị làm tròn: trong JavaScript, 12345678901234567890 thành 12345678901234567000, và 9007199254740993 thành 9007199254740992. Một số đơn hàng, số thẻ hay mã định danh trong cơ sở dữ liệu có thể bị đổi một cách âm thầm ngay khi một chương trình đọc nó như một con số. Vì vậy bộ chuyển đổi giữ số nguyên quá 15 chữ số dưới dạng chữ ngay cả khi đã bật chuyển đổi, và vì vậy các mã định danh dài như thế vốn nên được viết là chuỗi trong JSON.
3. Excel đã làm hỏng tệp trước khi bạn chuyển đổi
Mở CSV bằng cách nhấp đúp trong Excel sẽ chuyển những thứ trông giống số. 01234 thành 1234. Excel chỉ giữ 15 chữ số có nghĩa, nên số dài hơn bị thay các chữ số cuối bằng số 0, và thường hiển thị dạng 1.23457E+19. Những mã trông giống ngày, ví dụ 1-2, có thể bị biến thành ngày. Nếu sau đó bạn lưu tệp, hư hại là vĩnh viễn. Để tránh, hãy chuyển thẳng từ CSV gốc, hoặc nhập tệp thay vì mở: trong Excel dùng Data, rồi From Text/CSV, và đặt cột là Text; trong Google Sheets dùng File, rồi Import, và bỏ chọn "Convert text to numbers, dates, and formulas".
4. Dấu phân cách không phải dấu phẩy
Ở nhiều thiết lập khu vực châu Âu và Việt Nam, dấu thập phân là dấu phẩy, nên bảng tính lưu với dấu chấm phẩy giữa các giá trị. Nếu bộ chuyển đổi mặc định là dấu phẩy, mọi bản ghi sẽ dồn vào một cột. Hãy để Dấu phân cách ở "Tự động nhận biết": công cụ tách vài hàng đầu bằng dấu phẩy, chấm phẩy, tab và gạch đứng, bỏ qua dấu phân cách nằm trong ngoặc nháy, rồi chọn cái cho cùng số cột trên nhiều hàng nhất. Một tệp dùng dấu chấm phẩy như name;price có giá trị 1,50 vẫn được chuyển đúng, với 1,50 là một giá trị. Bạn cũng có thể tự chọn dấu phân cách.
5. Chữ có dấu thành ký tự rác
CSV chỉ là văn bản, và Excel tự quyết định cách đọc nó. Tệp UTF-8 không có dấu BOM thường làm tiếng Việt hay các chữ có dấu khác hiển thị sai. Khi chuyển JSON sang CSV để mở bằng Excel, hãy chọn "Thêm dấu BOM (giúp Excel hiển thị đúng dấu)" để Excel nhận ra UTF-8. Khi đọc một tệp CSV có dấu BOM, bộ chuyển đổi tự bỏ nó đi.
Chuyển từng bước
- Mở thẻ CSV sang JSON. Dán CSV, hoặc thả một tệp, hoặc nhấn "Mở tệp".
- Để Dấu phân cách ở tự động và giữ chọn "Hàng đầu là tiêu đề" để được mảng các đối tượng đặt tên theo cột. Chọn "Mảng các mảng" nếu không có tiêu đề.
- Giữ tắt "Chuyển số, true/false và ô trống" trừ khi chương trình của bạn cần số thật. Khi bật, ô trống thành
null, ô chứa chữ NULL cũng vậy, còntruevàfalsethành giá trị logic. - Xem dòng dưới kết quả, nó cho biết đã tìm thấy bao nhiêu hàng và cột, cùng các cảnh báo. Một dấu nháy mở không bao giờ đóng làm phần còn lại của văn bản thành một ô, và công cụ nêu rõ dòng nào.
- Sao chép JSON hoặc tải về. Để chắc chắn đó là JSON hợp lệ, hãy dán nó vào công cụ định dạng JSON.
JSON sang CSV
Dán một mảng các đối tượng. Các cột là mọi khoá xuất hiện ở bất kỳ bản ghi nào, theo thứ tự chúng xuất hiện lần đầu, và bản ghi thiếu một khoá sẽ có ô trống. Dữ liệu lồng nhau được làm phẳng theo một cách đã nêu rõ: các khoá được nối bằng dấu chấm, và các phần tử trong mảng được đánh số. Dữ liệu này:
[
{"id": 1, "customer": {"name": "An", "city": "Ha Noi, VN"}, "items": ["pen", "ink"]},
{"id": 2, "customer": {"name": "Binh"}, "items": ["pad"]}
]cho các cột id, customer.name, customer.city, items.0 và items.1, và hàng thứ hai có ô trống ở chỗ nó không có giá trị. "Ha Noi, VN" được bao trong dấu nháy ở CSV vì nó chứa dấu phẩy. Nếu bạn muốn mỗi mảng nằm trong một cột dưới dạng chữ JSON, hãy chọn "Giữ dạng JSON trong một ô".
Thử đi một vòng rồi quay lại trên chính tệp của bạn
Trước khi tin một phép chuyển trên tệp lớn, hãy chuyển nó sang JSON, nhấn "Dùng kết quả làm đầu vào", chuyển ngược lại thành CSV rồi so sánh hai bản CSV bằng công cụ so sánh văn bản. Với dữ liệu thuần như ví dụ trên, văn bản quay về giống hệt. Nếu có gì khác, dòng được tô sáng cho thấy chính xác giá trị nào đã đổi.
Cảnh báo về công thức
Nếu một ô bắt đầu bằng =, +, - hoặc @, Excel và các bảng tính khác coi nó là công thức khi bạn mở tệp. Đó là rủi ro đã biết khi dữ liệu đến từ người dùng hoặc nguồn không đáng tin. Hãy kiểm tra dữ liệu đó trước khi mở bằng bảng tính.
Danh sách kiểm tra ngắn
Chuyển từ CSV gốc, không chuyển từ bản bảng tính đã lưu lại. Giữ giá trị dưới dạng chữ trừ khi chương trình cần số. Để dấu phân cách được tự nhận ra, thêm dấu BOM khi CSV sẽ đi vào Excel, và thử đi một vòng rồi quay lại trước khi chuyển thứ gì lớn.