Đưa một bảng từ Excel vào README, trang web, cơ sở dữ liệu hay bài báo nghe thật đơn giản: chỉ là hàng và cột. Rồi một ô có dấu phẩy, ô khác có dấu nháy kép, ô thứ ba có xuống dòng gõ bằng Alt+Enter, và kết quả thừa một cột, một hàng bị tách đôi, hoặc bảng Markdown hiện thành một đoạn văn. Bài này chỉ ra chính xác chỗ chuyển đổi bị hỏng, mỗi định dạng phải bảo vệ các ký tự khó thế nào, kèm ví dụ thật tạo bằng công cụ chuyển đổi bảng.
Bảng thử
Ba hàng thực đơn quán cà phê, mỗi hàng một vấn đề:
| Sản phẩm | Giá | Ghi chú |
|---|---|---|
| Cà phê sữa | 35000 | Iced, "less sugar" |
| Bánh mì | 25000 | Pâté (xuống dòng) no chili |
| Trà (gạch đứng) đào | 45000 | (trống) |
Ghi chú đầu có dấu phẩy và nháy kép, ghi chú thứ hai có xuống dòng trong ô, tên sản phẩm thứ ba có ký tự gạch đứng, và ghi chú thứ ba trống. Dấu tiếng Việt có mặt ở khắp nơi.
Bảng tính thực sự sao chép cái gì
Chọn ô trong Excel hoặc Google Sheets rồi sao chép: bộ nhớ tạm nhận văn bản phân cách bằng tab (TSV), mỗi hàng một dòng. Ô nào chứa tab, xuống dòng hay nháy kép được bọc trong nháy kép và nháy bên trong được nhân đôi, giống hệt CSV. Vì thế dán vào ô văn bản thường hay trông sai: xuống dòng trong ô hiện thành dòng mới, và chỉ trình đọc hiểu dấu nháy mới biết đó vẫn là cùng một hàng.
CSV: bọc nháy và nhân đôi nháy
RFC 4180, thứ gần nhất với một chuẩn của CSV, quy định: trường nào chứa dấu phân cách, nháy kép hay xuống dòng thì bọc trong nháy kép, và nháy bên trong viết hai lần. Thực đơn thành:
Product,Price,Note
Cà phê sữa,35000,"Iced, ""less sugar"""
Bánh mì,25000,"Pâté
no chili"
Trà | đào,45000,Bốn bản ghi nhưng năm dòng chữ. Bất cứ thứ gì đếm hàng bằng cách đếm dòng, hay tách mỗi dòng theo dấu phẩy, đều sai. Ô trống chỉ đơn giản là không có gì sau dấu phẩy cuối.
Hai điểm thực tế. Excel ở nhiều nước châu Âu và Mỹ Latinh, gồm cả Brazil, mặc định dùng dấu chấm phẩy, vì dấu phẩy là dấu thập phân của họ; hãy chọn dấu phân cách hợp với người sẽ mở tệp. Và Excel trên Windows thường chỉ đọc CSV là UTF-8 khi tệp bắt đầu bằng ký tự BOM, nên công cụ thêm BOM vào tệp CSV và TSV tải xuống; thiếu nó, "Cà phê sữa" có thể mở ra thành "Cà phê sữa".
Markdown: thoát dấu gạch đứng, thay xuống dòng
Bảng Markdown ngăn ô bằng |, nên gạch đứng trong ô phải viết \|. Mỗi hàng phải nằm trên một dòng, nên xuống dòng được thay bằng <br>, GitHub hiển thị thành ngắt dòng:
| Product | Price | Note |
| ---------- | ----- | ------------------ |
| Cà phê sữa | 35000 | Iced, "less sugar" |
| Bánh mì | 25000 | Pâté<br>no chili |
| Trà \| đào | 45000 | |Nháy kép và dấu phẩy không cần xử lý gì. Phần đệm khoảng trắng không bắt buộc nhưng giúp bảng dễ đọc ở dạng văn bản thô. Markdown cũng bắt buộc có hàng tiêu đề; bảng không có tiêu đề sẽ được đặt tên cột chung.
HTML: thực thể và `<br>`
Trong HTML, ký tự nguy hiểm là <, & và, trong thuộc tính, ". Thoát chúng thành thực thể giúp một ô như a<b không bị đọc thành thẻ, và văn bản dán vào không chèn được mã. Dấu nháy trong ghi chú thành ", xuống dòng thành <br>, ô trống thành <td></td>.
SQL: nhân đôi dấu nháy đơn
Chuỗi trong SQL dùng nháy đơn, nên nháy đơn bên trong viết hai lần: O'Brien thành 'O''Brien'. Thực đơn, với SQL chuẩn, ô trống là NULL và số không đặt trong nháy:
INSERT INTO "menu" ("Product", "Price", "Note") VALUES
('Cà phê sữa', 35000, 'Iced, "less sugar"'),
('Bánh mì', 25000, 'Pâté
no chili'),
('Trà | đào', 45000, NULL);Các biến thể khác nhau ở chi tiết. MySQL còn coi dấu gạch chéo ngược là ký tự thoát, nên gạch chéo thật phải nhân đôi, và tên được bọc bằng dấu huyền ngược. SQL Server bọc tên bằng ngoặc vuông và cần chuỗi N'…' để chữ tiếng Việt không bị đổi sai bảng mã. Hãy quyết định có chủ đích ô trống là NULL (không biết) hay '' (biết là trống); hai thứ này cư xử khác nhau trong truy vấn.
LaTeX: mười ký tự đặc biệt
LaTeX dành riêng \ & % $ # _ { } ~ ^. Một ô "50% & $5" phải thành 50\% \& \$5, nếu không tài liệu không biên dịch được. Xuống dòng trong ô không được phép ở cột l thường, nên công cụ dùng \shortstack[l]{Pâté\\no chili}, chạy được trong LaTeX chuẩn không cần gói thêm.
Đọc ngược: phép thử thật
Một phép chuyển đổi đáng tin phải đọc lại kết quả của chính nó ra đúng bảng ban đầu. Bộ kiểm thử của công cụ làm điều đó cho mọi định dạng với một bảng cố tình "khó": nháy, phẩy, xuống dòng, gạch đứng, mọi ký tự đặc biệt của LaTeX, tiếng Việt, tiếng Nhật, emoji và ô trống. Cả tám định dạng đều trả về đúng từng ô.
Những lỗi thường gặp
- Tách theo dấu phẩy trong đoạn mã hay công thức. Hãy dùng trình đọc CSV hiểu dấu nháy.
- Đếm hàng bằng đếm dòng. Xuống dòng trong ô làm sai con số.
- Để bảng tính "sửa" dữ liệu. Mở CSV bằng Excel biến
007thành 7, mã số dài thành dạng khoa học bị làm tròn (1.23457E+15), và một số mã thành ngày tháng. Hãy nhập với cột kiểu Text, hoặc chuyển đổi mà không mở tệp. - Quên quyết định hàng tiêu đề. JSON dạng đối tượng, danh sách cột SQL và Markdown đều cần; hãy nói rõ hàng đầu là dữ liệu hay tên cột.
- Tưởng số trong JSON là an toàn. Mã số 20 chữ số đọc thành số JavaScript sẽ mất chữ số. Giữ mã số ở dạng chuỗi; công cụ chỉ ghi số khi bạn yêu cầu, và không bao giờ với giá trị dài hơn 15 chữ số.
Với tệp CSV hay JSON lớn, có dữ liệu lồng nhau, công cụ CSV và JSON phù hợp hơn; công cụ chuyển đổi bảng dành cho những bảng bạn muốn nhìn thấy và sửa.