CSV có phải là sự thay thế tốt cho XML và JSON không? [đóng cửa]


22

CSV coi là một lựa chọn tốt đối với XMLJSON cho các ngôn ngữ lập trình?

Tôi thường sử dụng XML và JSON (hoặc đôi khi là tệp văn bản thuần túy) làm lưu trữ tệp phẳng. Tuy nhiên, gần đây tôi đã bắt gặp một triển khai CSV trong PHP . Tôi thường đã thấy CSV được sử dụng cho các đầu vào trong các tệp Excel , nhưng tôi chưa bao giờ sử dụng nó với lập trình. Nó sẽ tốt hơn XML hay JSON theo bất kỳ cách nào?


3
Câu hỏi này rất mơ hồ. Bạn đang hỏi liệu CSV có định dạng tốt hơn như một hệ thống lưu trữ không, hoặc bạn đang hỏi liệu có bất kỳ lý do nào để sử dụng CSV trên XML / JSON không?
GrandmasterB

4
Bất kỳ cấu trúc thông báo CSV nào cũng có thể được ánh xạ sang định dạng thông báo XML hoặc JSON. Không phải tất cả định dạng thông báo XML / JSON có thể được ánh xạ tới CSV. Vì vậy, CSV chỉ bao gồm một trường hợp sử dụng dữ liệu cụ thể, định dạng dạng bảng, trong đó JSON và XML có thể bao gồm các cấu trúc thông báo phức tạp hơn.
Jon Raynor

@JonRaynor: Tôi nghĩ rằng bất kỳ định dạng XML hoặc JSON nào cũng có thể được ánh xạ tới CSV - nhưng không rõ ràng. Bạn sẽ phải phát minh ra một số cách biểu diễn cấu trúc cây. Kết quả sẽ là xấu xí và gần như chắc chắn không đáng để thực hiện. Đối với hầu hết các mục đích thực tế, bạn đã đúng.
Keith Thompson

Câu trả lời:


41

Câu trả lơi con phụ thuộc vao nhiêu thư.

CSV là tuyệt vời cho các trường hợp sử dụng nhất định. Ví dụ, dưới dạng định dạng "phát trực tuyến" cho các bộ dữ liệu lớn, việc truyền phát dễ dàng hơn XML / JSON và các tệp CSV chiếm ít không gian lưu trữ hơn. Tôi sử dụng nó để truyền phát bộ dữ liệu trong phạm vi gigabyte nơi các định dạng khác không thực tế.

Nó cũng thực sự phổ biến trong một số ngành công nghiệp khi xử lý các hệ thống và quy trình làm việc cũ. Hãy thử nhập JSON vào MS Excel.

ODI gần đây đã nhận xét về CSV, gọi năm 2014 là "Năm của CSV"

Để định dạng CSV "phù hợp", hãy xem xét sử dụng loại mime CSV trong các phản hồi HTTP của bạn.


2
+1 cho các hệ thống cũ; trong khi hệ thống di sản có thể không được sử dụng CSV một cách dự định (Tôi vừa mới phải thỏa thuận với nhập tệp CSV đó là, một cách trung thực, báo cáo, không phải là một bảng), chúng ta phải đối phó với thông tin di sản trên toàn thế giới .
Brian S

1
CSV có lợi thế phát trực tuyến là một vấn đề lớn: trình phân tích cú pháp CSV có trạng thái xử lý ít hơn nhiều so với trình phân tích cú pháp JSON hoặc XML.
Matt

22

Chắc chắn là không.

CSV là một định dạng bảng ánh xạ rất tốt đến các tập dữ liệu hoặc dữ liệu dạng bảng khác. Nhưng không phải tất cả dữ liệu là bảng! Nói chung, chúng tôi muốn tuần tự hóa đồ thị đối tượng . Điều này có thể khó khăn trong các trường hợp sau:

  • tài liệu tham khảo thông tư
  • các sơ đồ con được chia sẻ (ví dụ hai đối tượng mà cả hai cùng chứa một đối tượng là một thành viên)
  • các đối tượng thuộc các loại khác nhau được nối tiếp vào cùng một tài liệu

Chúng tôi muốn có thêm khả năng tái tuần tự hóa các đối tượng từ định dạng lưu trữ của chúng tôi.

XML

Chủ yếu là một ngôn ngữ đánh dấu mở rộng . Nó có thể được cắm sừng để lưu trữ cấu trúc dữ liệu chung là tốt. Hỗ trợ ngôn ngữ cho ID có nghĩa là các biểu đồ phức tạp có thể được tạo, mặc dù nó được sử dụng tốt nhất cho cây. Một tài liệu có thể được kiểm tra tính chính xác đối với một đặc điểm kỹ thuật. Có nhiều vấn đề khác nhau với định dạng này có thể làm cho nó không thực tế, chẳng hạn như tính dài dòng.

JSON

Chủ yếu là một cách để lưu trữ cây đối tượng đơn giản . Không có hỗ trợ cho đồ thị chung. JSON không có khái niệm về kiểu ngoài chuỗi nguyên thủy , số nguyên , float , boolean , nullmảngđối tượng kiểu bộ sưu tập .

YAML

Dễ hiểu nhất là một phần mở rộng của JSON. Có một khái niệm bí danh cho phép tạo ra các đồ thị đối tượng có độ phức tạp tùy ý. Có một khái niệm về siêu dữ liệu như các thẻ có thể được sử dụng để gõ đúng.

CSV

Không có gì, ngoại trừ một bảng duy nhất. Nếu chúng ta muốn lưu trữ các biểu đồ đối tượng, chúng ta sẽ phải sử dụng một lược đồ như

#ID,Type,Field1,Field2,...,FieldN

1,String,foo
2,String,bar
3,Array<String>,1,2

Có nhiều phương ngữ của CSV không đồng ý với các dấu phân cách, dấu kết thúc dòng, trích dẫn, ký tự thoát và nhiều vấn đề khác khiến nó không phù hợp với dữ liệu chung (nhị phân). Tất cả điều này làm cho việc xử lý dữ liệu CSV khá khó khăn.

Vì vậy, về cơ bản, những điều dễ dàng là khó khăn hoặc không thể với CSV khi sử dụng nó làm định dạng tuần tự hóa chung.

Lời chỉ trích này không áp dụng khi sử dụng nó để lưu trữ dữ liệu dạng bảng thực sự như bảng thời gian hoặc một loạt các phép đo. Ở đây, CSV (thường trong biến thể của các giá trị được phân tách bằng tab) thường nhỏ gọn và dễ sử dụng hơn các định dạng dữ liệu khác.


1
Tôi nghĩ rằng đây là một lập luận công bằng. Chúng khác nhau, vì vậy hãy sử dụng chúng cho những thứ khác nhau, sử dụng từng nơi tốt nhất.
Ben

1
Nếu không có dòng đầu tiên thì đây sẽ là một câu trả lời tốt. CSV là một thay thế tốt cho XML cho thông tin dạng bảng (tệp SQLite có thể phân phối có thể tốt hơn cả hai). Nhưng như bạn giải thích cho dữ liệu dạng bảng thì đó là sự lựa chọn tệp ưu việt.

4

Tôi cũng phải nói rằng nó phụ thuộc vào những gì bạn đang cố gắng đạt được. Đối với nhiều vấn đề, bạn không chọn vấn đề gì nếu vấn đề đủ nhỏ và sự lựa chọn của bạn phù hợp với hệ thống hiện có.

Việc sử dụng một hệ thống cũ và cố gắng đánh giày theo một định dạng mới đôi khi có thể là một vấn đề vì bạn đã giới thiệu sự phức tạp hơn và có một hệ thống đầu vào mới để gỡ lỗi. Tôi đã thấy điều này rất nhiều khi những người mới thích một cái gì đó khác với những gì tồn tại hoặc khi một định dạng mới xuất hiện và họ muốn thử nghiệm nó. Điều này có thể hoặc không thể là một ý tưởng tốt, nó phụ thuộc vào hoàn cảnh.

Nhiều năm trước tôi đã làm việc trên một hệ thống cơ sở dữ liệu đồ thị nghiên cứu phụ thuộc vào các tệp CSV có định dạng khác nhau. Trình nhập tệp CSV sẽ xây dựng biểu đồ cho chúng tôi và họ đã thực hiện nhiều năm để gỡ lỗi và tối ưu hóa mã. Nó vừa nhanh, vừa linh hoạt và chúng tôi vui vẻ sử dụng nó để khởi động các dự án nghiên cứu lớn. Khi XML xuất hiện trên cảnh chúng tôi đã thêm một nhà nhập khẩu XML nhưng nó không nhất thiết phải là một sự cải thiện về tốc độ hoặc biểu hiện độ phức tạp và chắc chắn XML không thể biểu hiện tốt hơn các cấu trúc đồ thị so với CSV. JSON đẹp hơn (và phức tạp hơn) so với XML nhưng tương tự nhau ở nhiều khía cạnh vì vậy tôi mong đợi một kết quả tương tự khi tạo một nhà nhập khẩu mới trên hệ thống đó.

Tại một thời điểm, chúng tôi đã có một khách hàng mang đến một lượng lớn dữ liệu ở định dạng (như chúng tôi gọi là), các tệp có các dòng có độ dài thay đổi có chứa các dấu chỉ ra cách diễn giải các byte theo dòng đó. Nó xuất phát từ thời lưu trữ đắt tiền nên sự gọn nhẹ là một yêu cầu. Chúng tôi đã nhập dữ liệu đó bằng cách chuyển đổi nó thành định dạng CSV một cách nhanh chóng và đưa dữ liệu đó vào nhà nhập khẩu CSV. Điều đó thật dễ dàng để làm và giảm thiểu số lượng gỡ lỗi và bảo trì, đó là những điều tốt. Nếu chúng ta phải nhập loại dữ liệu đó mọi lúc, chúng ta có thể đã trực tiếp xây dựng nó vào hệ thống để đạt được hiệu suất và hiệu quả.

Vì vậy, nó phụ thuộc vào những gì bạn đang làm và vào những gì hệ thống cơ bản làm. Trong ví dụ của tôi, nhà nhập khẩu CSV được thiết kế chắc chắn và đáng tin cậy. Tôi ngần ngại nói với bạn rằng một định dạng tốt hơn hoặc xấu hơn mà không hiểu những gì đang diễn ra trong các lớp khác mà tôi đang xây dựng. Tôi yêu JSON và thích nó, nhưng tôi biết rằng với một số cấu trúc dữ liệu phức tạp nhất định và các tập dữ liệu đủ lớn, các tệp CSV cũng có thể được thực hiện để hoạt động rất tốt.


3

Không.

CSV không thực sự là một định dạng duy nhất. Có rất nhiều kiểu để thoát, dấu phân cách và các vấn đề định dạng khác mà nhiều tệp CSV trong tự nhiên có.

Nếu bạn sẽ sử dụng điều này như một bộ lưu trữ tệp phẳng, sử dụng JSON sẽ phục vụ bạn tốt hơn nhiều. Ánh xạ JSON đến và từ các đối tượng với ít rắc rối hơn bạn sẽ phải loại bỏ CSV để làm như vậy.


0

Tôi sẽ khuyên mạnh mẽ chống lại nó. Tôi có thể ổn khi xuất CSV tại một số điểm (nếu người dùng yêu cầu). Nhưng nó là một phù hợp xấu cho mục đích lưu trữ / nhập khẩu. Điều này chủ yếu là do thực tế là "CSV" rất không rõ ràng. Chữ "C" có dấu "dấu phẩy" hoặc "ký tự" được phân tách không? Làm thế nào để bạn xử lý các chuỗi văn bản có chứa các ký tự thoát như "? Mỗi triển khai CSV bị nguyền rủa xử lý các ký tự thoát, v.v ... khác nhau, dẫn đến các tệp có thể ngoại trừ nhưng không được nhập, v.v.

Excel là một minh chứng tốt: Trong phiên bản tiếng Anh, nó sử dụng "," làm dấu phân cách. Ở Đức, nó sử dụng ";". Vì vậy, một phiên bản tiếng Đức nghẹt thở trên các tệp CSV tiếng Anh và ngược lại ...

Sức mạnh chính của nó là khả năng đọc của con người, không nên giảm giá. Nhưng tôi sẽ không dựa vào nó như một định dạng lưu trữ, nó quá dễ vỡ cho mục đích đó. Nếu bạn phải xuất tệp cho người, bạn có thể sử dụng CSV nhưng ngay cả khi đó tôi sẽ cố gắng sử dụng thư viện ghi vào tệp xlsx (chúng có sẵn miễn phí).


3
Đó là "dấu phẩy", xem RFC 4180 . Chỉ vì Microsoft đã phá vỡ một cái gì đó ở Đức không có nghĩa là một định dạng chuẩn là vô dụng ...
Ben

Không, đó không phải là "Dấu phẩy" - nó cũng có thể có nghĩa là "phân tách ký tự" và vấn đề không giới hạn ở Đức. Có, RFC chỉ định khác, nhưng một tệp có tên "csv" có thể chứa một crapload khác nhau, các kiểu thoát, v.v. Khi bạn cố gắng nhập một tệp như vậy, chương trình của bạn sẽ nhập ... một cái gì đó, nhưng không phải là thứ bạn muốn.
Christian Sauer

Câu trả lời này xác định những cạm bẫy quan trọng đối với CSV.
gdbj

-3

Nói chung SỐ Tại sao? JSON và XML về cơ bản là để loại bỏ CSV đáng sợ. Chúng là các cách tiếp cận có cấu trúc của những gì đã được thực hiện không có cấu trúc với CSV trong một thời gian dài. Có, có một số trường hợp sử dụng trong đó CSV vẫn được ưa thích hơn nhưng nói chung trong 9 trên 10 trường hợp bạn không nên sử dụng CSV.


7
Tất nhiên trừ khi dữ liệu bạn chuyển là "phẳng". Sau đó, bạn tiết kiệm được một khoản lớn bằng cách không chuyển các thẻ XML vô dụng, v.v.
Ben
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.