- CSV’nin yerini alacak "üstün" formatlar sık sık tanıtılıyor, ancak bunların çoğu önyargılı karşılaştırmalara dayanıyor ve CSV’nin gerçek güçlü yanlarını göz ardı ediyor
- Bu yazı CSV’nin kusursuz olduğunu söylemiyor; amaç, yeterince takdir edilmeyen avantajlarını görünür kılmak
- CSV’den nefret etmenin havalı göründüğü havaya karşı, CSV’nin gerçek değerini yeniden hatırlatıyor
1. CSV son derece basittir
- CSV’nin tanımı başlığında saklıdır: "virgülle ayrılmış değerler"
- Satırlar satır sonlarıyla, sütunlar virgüllerle ayrılır
- Bir değerde virgül ya da satır sonu varsa tırnak içine alınır; tırnağın kendisi ise çift tırnakla gösterilir
- Karmaşık bir spesifikasyon olmadan herkes tarafından sezgisel olarak anlaşılabilir ve kullanılabilir
- Yine de doğru ayrıştırma için özel bir CSV ayrıştırıcısı kullanmak hâlâ gereklidir
2. CSV kolektif bir fikirdir
- Bir sahibi yoktur, özelleştirilmemiştir
- RFC 4180 vardır, ancak çoğu kişi bunu yalnızca referans olarak görür
- Dünya çapındaki geliştiricilerin örtük biçimde paylaştığı ortak kurallara dayanan özgür bir formattır
3. CSV bir metindir
- JSON, YAML ve XML gibi insan tarafından okunabilen saf metin formatıdır
- Herhangi bir metin düzenleyiciyle açılabilir, ek araç olmadan içeriği kontrol etmek mümkündür
- Kodlama biçimi de serbestçe seçilebilir
4. CSV streaming için optimize edilmiştir
- Satır satır okunan bir yapı olduğu için bellek tüketimi çok düşüktür
- Basit bir kodla bile birkaç KB bellek kullanarak birkaç gigabayt veriyi işlemek mümkündür
- Parquet gibi sütun odaklı formatlarda streaming işleme zordur ve karmaşık buffering gerekir
- Dezavantajı ise yalnızca belirli sütunlara bakmak istediğinizde bile tüm satırı okumanız gerekmesidir
5. CSV’ye veri eklemek kolaydır
- Dosyayı append modunda(
a+) açıp sona yeni satırlar eklemek son derece kolaydır
- Buna karşılık Parquet gibi sütun odaklı formatlarda satır eklemek verimsiz ve karmaşıktır
6. CSV dinamik tipleri destekler
- Sabit tipler olmadığı için veriyi esnek biçimde yorumlamak mümkündür
- Örneğin JavaScript 64 bit tamsayıları düzgün biçimde gösteremez, ancak CSV bu tür kısıtlar olmadan kullanılabilir
- Diller arası uyumluluk ve esneklik açısından avantaj sağlar
- Ancak yanlış yorumlanırsa hata oluşabilir → kullanırken dikkat gerekir
- Yüksek performans gerektiğinde metni decode etmeden, doğrudan binary düzeyde işlemek de mümkündür
7. CSV sadedir
- Header yalnızca dosyanın en başında bulunduğundan format tekrarı neredeyse yoktur
- JSON ve XML’de anahtarların tekrarlanması nedeniyle overhead yüksektir
- String gösterimi zaten sadedir ve formatın kendi overhead’i de (virgül, tırnak vb.) çok düşüktür
8. Ters çevrilmiş CSV de hâlâ geçerlidir
- CSV bayt düzeyinde ters çevrilse bile hâlâ geçerli bir CSV’dir
- Bunun nedeni çift tırnak escape yöntemidir; çünkü palindromik bir escape biçimidir
- Bu özellik sayesinde CSV dosyasının son kısmını çok verimli biçimde okumak mümkündür
- Örneğin yarıda kesilmiş bir süreci sürdürürken, yeniden başlatmak için dosyanın yalnızca son birkaç satırını okumak yeterli olabilir
9. Excel CSV’den hoşlanmaz
- Excel’in rahatsız olduğu bir formatsa, bu belki de aslında doğru yolda olduğunuzun işaretidir
3 yorum
En basiti en iyisidir!
Daha kötüsü daha iyidir!
Hacker News görüşü
CSV ve INI dosyalarını sevme nedenim, basit, metin tabanlı olmaları, biçimde kodlanmış tipler içermemeleri ve yalnızca dizelerden oluşmaları
CSV zarif, ama ölümcül bir kusuru var: tırnak işaretleri "yerel olmayan" bir etkiye sahip
CSV'nin en iyi yanı, herkesin 30 dakikada bir parser yazabilmesi
CSV'yi seven biri muhtemelen kurumsal ortamda CSV injection önleme işiyle uğraşmak zorunda kalmamıştır
CSV'yi sevmek için birçok neden var
Son zamanlarda Raspberry Pi tabanlı bir çözüm geliştiriyorum
CSV'nin sıkıcı tarafı, hızlıca yazılmış parser ve serializer'ların tırnak işaretlerini yanlış ele alma gibi yaygın hataları tekrar etmesi
csvstandart kütüphane modülünü kullanınca fikrim değiştiEğer bu gerçekten bir aşk mektubu olsaydı, CSV formatında yazılmış olurdu
JSON lehine karşı argümanlar pek ikna edici değil
Modern formatları seven biri olarak, şüphe duyduğumda CSV ya da JSONL kullanıyorum
grepile kolayca aranabiliyor ve stream edilebiliyorlar