Apakah CSV alternatif yang baik untuk XML dan JSON? [Tutup]

22

Apakah CSV dianggap sebagai opsi yang baik terhadap XML dan JSON untuk bahasa pemrograman?

Saya biasanya menggunakan XML dan JSON (atau terkadang file teks biasa) sebagai penyimpanan file datar. Namun, baru-baru ini saya menemukan implementasi CSV di PHP . Saya biasanya melihat CSV digunakan untuk input dalam file Excel , tetapi saya tidak pernah menggunakannya dengan pemrograman. Apakah akan lebih baik daripada XML atau JSON dengan cara apa pun?

Wisnu G
sumber
3
Pertanyaan ini tidak jelas. Apakah Anda bertanya apakah CSV membuat format yang lebih baik sebagai sistem penyimpanan, atau Anda menanyakan apakah ada setiap alasan untuk menggunakan CSV lebih XML / JSON?
GrandmasterB
4
Setiap struktur pesan CSV dapat dipetakan ke format pesan XML atau JSON. Tidak semua format pesan XML / JSON dapat dipetakan ke CSV. Jadi, CSV hanya mencakup kasus penggunaan data tertentu, format tabular, di mana JSON dan XML dapat mencakup struktur pesan yang lebih kompleks.
Jon Raynor
@ JonRaynor: Saya pikir semua format XML atau JSON dapat dipetakan ke CSV - tetapi tidak bersih. Anda harus menemukan cara mewakili struktur pohon. Hasilnya akan jelek dan hampir pasti tidak layak diterapkan. Untuk hampir semua tujuan praktis, Anda benar.
Keith Thompson
@KeithThompson itu ditemukan :)
Eliran Malka

Jawaban:

41

Jawabannya adalah, tergantung.

CSV sangat bagus untuk kasus penggunaan tertentu. Misalnya sebagai format "streaming" untuk kumpulan data besar, lebih mudah untuk streaming daripada XML / JSON, dan file CSV mengambil lebih sedikit ruang penyimpanan. Saya menggunakannya untuk mengalirkan kumpulan data dalam rentang gigabyte di mana format lain tidak praktis.

Ini juga sangat umum di industri tertentu ketika berhadapan dengan sistem lama dan alur kerja. Coba impor JSON ke dalam MS Excel.

ODI baru-baru ini berkomentar tentang CSV, menyebut 2014 "Tahun CSV"

Untuk pemformatan CSV "benar", pertimbangkan untuk menggunakan tipe mime CSV dalam respons HTTP Anda.

tom
sumber
2
+1 untuk sistem lawas; sedangkan sistem warisan tidak mungkin menggunakan CSV dalam cara yang dimaksudkan (Saya baru saja harus berurusan dengan mengimpor CSV yang, jujur, laporan, tidak meja), kita lakukan harus berurusan dengan informasi warisan di seluruh dunia .
Brian S
1
CSV memiliki keunggulan streaming yang merupakan masalah besar: parser CSV memiliki lebih sedikit kondisi yang harus dihadapi daripada parser JSON atau XML.
Matt
22

Jelas tidak.

CSV adalah format tabel yang memetakan dengan sangat baik ke kumpulan data atau data tabular lainnya. Tetapi tidak semua data berbentuk tabel! Secara umum, kami ingin membuat serial objek grafik . Ini bisa sulit dalam kasus-kasus berikut:

  • referensi melingkar
  • subgraph bersama (mis. dua objek yang sama-sama berisi objek yang sama dengan anggota)
  • objek dari berbagai jenis yang akan diserialisasi ke dokumen yang sama

Kami selanjutnya ingin dapat menderailkan objek secara andal dari format penyimpanan kami.

XML

Terutama merupakan bahasa markup yang dapat dikembangkan . Ini dapat bertanduk sepatu untuk menyimpan struktur data umum juga. Dukungan bahasa untuk ID berarti bahwa grafik kompleks dapat dibuat, meskipun paling baik digunakan untuk pohon. Suatu dokumen dapat diuji kebenarannya terhadap suatu spesifikasi. Ada berbagai masalah dengan format ini yang dapat membuatnya tidak praktis, seperti verbositas ekstrim.

JSON

Terutama merupakan cara untuk menyimpan pohon objek sederhana . Tidak ada dukungan untuk grafik umum. JSON tidak memiliki konsep tipe di luar string primitif , integer , float , boolean , null dan array tipe koleksi dan objek .

YAML

Paling mudah dipahami sebagai perpanjangan JSON. Memiliki gagasan tentang alias yang memungkinkan grafik objek dengan kompleksitas sewenang-wenang dibuat. Memiliki konsep tag mirip metadata yang dapat digunakan untuk mengetik dengan benar.

CSV

Tidak memiliki apa pun, kecuali satu meja. Jika kita ingin menyimpan grafik objek, kita harus menggunakan skema seperti

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

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

Ada banyak dialek CSV yang tidak setuju pada pembatas, terminator garis, mengutip, karakter melarikan diri, dan banyak masalah lain yang membuatnya tidak cocok untuk data umum (biner). Semua ini membuatnya agak sulit untuk memproses data CSV.

Jadi pada dasarnya, hal-hal mudah sulit atau tidak mungkin dengan CSV saat menggunakannya sebagai format serialisasi umum.

Kritik ini tidak berlaku ketika menggunakannya untuk menyimpan data yang benar-benar tabular seperti lembar waktu atau serangkaian pengukuran. Di sini, CSV (sering dalam varian nilai yang dipisahkan tab) biasanya lebih ringkas dan lebih mudah digunakan daripada format data lainnya.

amon
sumber
1
Saya pikir ini argumen yang adil. Mereka berbeda, jadi gunakan untuk hal yang berbeda, gunakan masing-masing di tempat yang terbaik.
Ben
1
Tanpa baris pertama ini akan menjadi jawaban yang bagus. CSV adalah alternatif yang baik untuk XML untuk informasi tabular (file SQLite yang dapat didistribusikan mungkin lebih baik dari keduanya). Tetapi saat Anda menjelaskan untuk data tabular, apakah itu pilihan file yang superior.
4

Saya juga harus mengatakan bahwa itu tergantung pada apa yang ingin Anda capai. Untuk banyak masalah, tidak masalah apa yang Anda pilih jika masalahnya cukup kecil dan pilihan Anda cocok dengan sistem yang ada.

Mengambil sistem lawas dan mencoba menyisir dalam format baru kadang-kadang bisa menjadi masalah karena Anda telah memperkenalkan lebih banyak kompleksitas dan memiliki sistem input baru untuk debug. Saya sering melihat ini ketika orang baru lebih suka sesuatu yang berbeda dari yang ada, atau ketika format baru muncul dan mereka ingin bereksperimen dengannya. Ini mungkin atau mungkin bukan ide yang baik, tergantung pada keadaan.

Bertahun-tahun yang lalu saya bekerja pada sistem basis data grafik penelitian yang bergantung pada file CSV dari berbagai format. Pengimpor file CSV akan membuat grafik untuk kami dan telah bertahun-tahun bekerja untuk debug dan mengoptimalkan kode. Itu cepat dan fleksibel dan kami dengan senang hati menggunakannya untuk mem-bootstrap proyek penelitian besar. Ketika XML muncul di tempat kejadian kami menambahkan importir XML tetapi itu tidak selalu merupakan peningkatan dalam hal kecepatan atau mengekspresikan kompleksitas, dan tentu saja XML tidak lebih baik dalam mengekspresikan struktur grafik daripada CSV. JSON jauh lebih bagus (dan terser) daripada XML tetapi serupa dalam banyak hal, jadi saya berharap hasil yang sama ketika membuat importir baru pada sistem itu.

Pada satu titik waktu kami memiliki pelanggan membawa sejumlah besar data dalam format "cobol", file dengan garis panjang variabel yang berisi penanda yang menunjukkan cara menafsirkan byte yang diikuti pada baris itu. Itu datang dari waktu ketika penyimpanan mahal sehingga kekompakan adalah persyaratan. Kami mengimpor data itu dengan mengonversinya ke dalam format CSV dengan cepat dan memasukkannya ke importir CSV. Itu mudah dilakukan dan meminimalkan jumlah debugging dan pemeliharaan, yang merupakan hal yang baik. Jika kami harus mengimpor data semacam itu sepanjang waktu, kami mungkin telah memasukkannya ke dalam sistem secara langsung untuk mendapatkan peningkatan kinerja dan efisiensi.

Jadi, itu tergantung pada apa yang Anda lakukan dan apa yang dilakukan sistem yang mendasarinya. Dalam contoh saya importir CSV direkayasa secara solid dan dapat diandalkan. Saya ragu untuk memberi tahu Anda bahwa satu format lebih baik atau lebih buruk tanpa memahami apa yang terjadi di lapisan lain yang saya bangun. Saya suka JSON dan lebih menyukainya, tetapi saya tahu bahwa dengan struktur data yang kompleks dan set data yang cukup besar, file CSV dapat dibuat bekerja dengan sangat baik juga.

Jujur.
sumber
3

Tidak.

CSV sebenarnya bukan format tunggal. Ada berbagai gaya untuk melarikan diri, pemisah, dan masalah pemformatan lainnya yang dimiliki oleh banyak file CSV.

Jika Anda akan menggunakan ini sebagai penyimpanan file datar, menggunakan JSON akan memberi Anda jauh lebih baik. JSON memetakan ke dan dari objek-objek dengan kerumitan yang jauh lebih sedikit daripada Anda akan memiliki CSV kludging untuk melakukannya.

Apa namanya
sumber
0

Saya akan sangat menyarankan untuk tidak melakukannya. Saya mungkin OK untuk output CSV di beberapa titik (jika pengguna memintanya). Tapi itu cocok untuk penyimpanan / tujuan impor. Ini sebagian besar disebabkan oleh fakta bahwa "CSV" sangat tidak jelas. Apakah "C" menunjukkan "koma" atau "karakter" terpisah? Bagaimana Anda memperlakukan string teks yang berisi karakter escape seperti "? Setiap implementasi CSV terkutuk memperlakukan karakter escape dll. Berbeda, yang mengarah ke file yang bisa ex- tetapi tidak diimpor dll.

Excel adalah demonstrasi yang baik: Dalam versi bahasa Inggris menggunakan "," sebagai pemisah. Di Jerman, ia menggunakan ";". Jadi versi Jerman tersedak file CSV bahasa Inggris, dan sebaliknya ...

Kekuatan utamanya adalah keterbacaan manusia, yang tidak boleh diabaikan. Tapi saya tidak akan mengandalkan itu sebagai format penyimpanan, terlalu rapuh untuk tujuan itu. Jika Anda harus mengekspor file untuk manusia, Anda mungkin menggunakan CSV tetapi bahkan kemudian saya akan mencoba menggunakan perpustakaan yang menulis ke file xlsx (mereka tersedia secara bebas).

Sauer Kristen
sumber
3
Ini "koma", lihat RFC 4180 . Hanya karena Microsoft memecahkan sesuatu di Jerman tidak berarti format standar tidak berguna ...
Ben
Tidak, ini bukan "Koma" - itu juga bisa berarti "karakter terpisah" dan masalahnya tidak terbatas pada Jerman. Ya, RFC menentukan sebaliknya, tetapi sebuah file bernama "csv" dapat berisi sejumlah pemisah yang berbeda, gaya pelarian dll. Ketika Anda mencoba mengimpor file seperti itu, program Anda akan mengimpor ... sesuatu, tetapi bukan yang Anda inginkan.
Christian Sauer
Jawaban ini mengidentifikasi jebakan penting terhadap CSV.
gdbj
-3

Secara umum NO. Mengapa? JSON dan XML pada dasarnya ada untuk menyingkirkan CSV yang ditakuti. Mereka adalah pendekatan terstruktur dari apa yang telah dilakukan tanpa terstruktur dengan CSV untuk waktu yang lama. Ya, ada beberapa kasus penggunaan di mana CSV masih disukai tetapi secara umum dalam 9 dari 10 kasus Anda lebih baik tidak menggunakan CSV.

Pieter B
sumber
7
Kecuali tentu saja data yang Anda transfer adalah "flat". Anda kemudian menghemat jumlah yang sangat besar dengan tidak mentransfer tag XML yang tidak berguna, dll.
Ben