Sự khác biệt thực sự giữa Excel CSV và CSV tiêu chuẩn


16

Sự khác biệt thực sự giữa CSV Excel và CSV tiêu chuẩn là gì?

Ví dụ, khi xử lý các cột có ngắt dòng bên trong một ô, làm thế nào để chúng mã hóa nó khác nhau?

Câu trả lời:


19

Nó hoàn toàn phụ thuộc vào những gì bạn xác định là CSV "tiêu chuẩn". Theo như tôi quan tâm, Excel tuân theo các quy tắc được nêu trong RFC 4180 , "Định dạng chung và Loại MIME cho tệp CSV".

Hãy xem xét một bảng trong đó ô đầu tiên trong hàng đầu tiên có hai dòng ngắt. Trong Excel, nó sẽ trông như sau:

+---+---------------+------------+------------+
|   | A             | B          | C          |
+---+---------------+------------+------------+
| 1 | col1, line1a  |            |            |
|   | col1, line1b  |            |            |
|   | col1, line1c  | col2, row1 | col3, row1 |
| 2 | col1, row2    | col2, row2 | col3, row2 |
+---+---------------+------------+------------+

Bây giờ, Excel sẽ xuất cái này như thế nào? Hãy xem - một trình soạn thảo văn bản sẽ hiển thị điều này:

"col1, line1a
col1, line1b
col1, line1c","col2, row1","col3, row1"
"col1, row2","col2, row2","col3, row2"

Không tinh vi lắm. Nó chèn một trở lại vận chuyển (hex 0D) trong đó ngắt dòng là trong tế bào của chúng tôi. Mỗi tế bào được bao quanh bởi dấu ngoặc kép. Ngoài ra, các hàng thực tế được phân tách với một sự trở lại vận chuyển.

Để phân tích chính xác điều này, một trình phân tích cú pháp CSV sẽ cần phải

  • bỏ qua sự trở lại vận chuyển đó khi nó xuất hiện trong dấu ngoặc kép (tức là một ô)
  • không bỏ qua vận chuyển trở lại khi nó xuất hiện bên ngoài dấu ngoặc kép

Nếu nó không làm điều đó, bạn sẽ kết thúc với một thứ bị cắt xén như thế này - lưu ý rằng bây giờ có bốn dòng thay vì hai, vì nó đã không bỏ qua các ngắt dòng.

+---+---------------+------------+------------+
|   | A             | B          | C          |
+---+---------------+------------+------------+
| 1 | "col1, line1a |            |            |
| 2 | col1, line1b  |            |            |
| 3 | col1, line1c" | col2, row1 | col3, row1 |
| 4 | col1, row2    | col2, row2 | col3, row2 |
+---+---------------+------------+------------+

Nhưng, hãy xem RFC nói gì, có lẽ Excel đã làm đúng?

Các trường có chứa dấu ngắt dòng (CRLF), dấu ngoặc kép và dấu phẩy phải được đặt trong dấu ngoặc kép.

Gọn gàng, đó chính xác là những gì Excel đã làm. Vì vậy, tóm tắt, Excel dường như tuân theo các đề xuất của tệp CSV "chuẩn". Được cung cấp một trình phân tích cú pháp CSV thích hợp, nó cũng có thể đọc các tệp CSV Excel.


@shhck: tại sao tôi thấy các triển khai trình phân tích cú pháp csv tách biệt "excel" csv với "csv"? Tôi cũng thấy excel là một triển khai khá mạnh mẽ.
157195

@ user157195 Phụ thuộc vào trình phân tích cú pháp, bạn nên đọc tài liệu của nó tại sao có sự khác biệt giữa đầu vào Excel và không phải Excel. Tôi sẽ không thấy tại sao nên có một. Tôi chỉ biết điều này từ R , đối xử với Excel CSV giống như mọi thứ khác. Tuy nhiên nó cũng có thể đọc XLS.
slhck

2
Là một người đã lập trình đọc các tệp CSV được tạo ra trong nhiều năm ở mọi hình dạng và kích cỡ, tôi có thể chứng thực rằng slhck là chính xác 100% - Excel tạo ra các tệp CSV "chuẩn" 100%. Mỗi lần như vậy.
Mark Henderson

@Fudeeker Cảm ơn bạn đã xác nhận! (và bạn có 1337 đại diện ngay bây giờ!)
slhck

5
Chú ý! Ở các quốc gia sử dụng ',' làm dấu thập phân Excel sẽ "rất rất thông minh" và sử dụng dấu ';' ký tự phân cách. Điều này giúp Zee Germanz không nhìn thấy quá nhiều "trích dẫn"; "trong"; "tệp"; "của họ. Thật không may nếu sau đó họ gửi nó đến văn phòng Vương quốc Anh, nó sẽ nhận được AllSmooshedUpIntoASingleCellOnEveryLine. Xuất sắc.
Luke Usherwood

-1

Sự hiểu biết của tôi từ việc triển khai csv ban đầu là tất cả các trường văn bản được đặt trong dấu ngoặc kép và số không cần phải có. Excel không làm điều này và nếu bạn cố tải lên các tệp csv được tạo trên Excel của mình trên các nền tảng không phải là microsoft thì chúng sẽ thất bại. Đây là một cách tiếp cận microsoft tiêu chuẩn, bỏ qua khả năng tương tác và tập trung vào việc tuân theo các quy tắc một cách mù quáng. Một điều tương tự cũng xảy ra với IE, họ đã tuân thủ chính xác các quy tắc html / css cho các thuộc tính phần đệm và lề và bỏ qua thực tế là mọi trang web và trình duyệt web hiện có đối xử với chúng khác nhau. Kết quả là hầu hết mọi trang web hiện nay đều có các quy tắc đặc biệt dành cho IE. Tôi thấy các tệp csv được tạo bởi excel vô dụng và sử dụng một cột các hàm "concatenate" để tự tạo chúng một cách chính xác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.