Hizmetler Hosting & Sunucu Araçlar Blog Ara Kurumsal EnglishEN
Teklif Alın

CSV Nedir ve Neden Hâlâ Bu Kadar Yaygın?

CSV (Comma-Separated Values), tablo verilerini düz metin hâlinde saklayan en eski ve en yaygın dosya formatlarından biridir. Her satır bir kaydı, satırdaki her değer ise virgülle ayrılmış bir sütunu temsil eder. Format o kadar basittir ki herhangi bir metin editörüyle açılıp okunabilir; ama bu görünürdeki basitlik, sanıldığı kadar sorunsuz değildir.

Excel ve Google Sheets gibi tablolama uygulamaları, e-ticaret platformlarının ürün/sipariş dışa aktarımları, muhasebe yazılımları, CRM sistemleri arasında veri taşıma ve veritabanı yedekleri hâlâ büyük oranda CSV kullanır. Sebebi basit: CSV, JSON veya XML'e göre çok daha az yer kaplar, insan gözüyle doğrudan okunabilir ve neredeyse her yazılım tarafından desteklenir.

Modern web uygulamaları verileri çoğunlukla JSON ile taşısa da, kullanıcıların elle düzenleyebildiği, Excel'de açıp filtreleyebildiği bir format hâlâ gerekiyor; bu noktada CSV'nin yerini tutan pratik bir alternatif yok. Bu yüzden bir API'den gelen JSON verisini raporlama için CSV'ye çevirmek ya da bir muhasebe programından dışa aktarılan CSV'yi bir web uygulamasına JSON olarak aktarmak, günlük yazılım geliştirme işlerinin sıradan bir parçasıdır.

RFC 4180: CSV'nin Resmi (Ama Az Bilinen) Kuralları

CSV uzun yıllar boyunca resmi bir standarda sahip değildi; her uygulama formatı biraz farklı yorumluyordu. 2005 yılında yayınlanan RFC 4180, o zamana kadar fiilen kullanılan CSV pratiklerini belgeleyerek ortak bir referans noktası oluşturdu. Zorunlu bir standart olmasa da bugün CSV üreten ve okuyan araçların büyük çoğunluğu bu kurallara uyar.

  • Alanlar virgülle (,) ayrılır, satırlar CRLF (satır başı + yeni satır) ile sonlanır.
  • Bir alan virgül, çift tırnak veya satır sonu karakteri içeriyorsa, alanın tamamı çift tırnak (") içine alınmalıdır.
  • Tırnaklanmış bir alanın içinde geçen çift tırnak karakteri, art arda iki çift tırnak ("") yazılarak kaçırılır (escape).
  • İlk satır genellikle, ama zorunlu olmadan, sütun başlıklarını (header) içerir.

Örneğin "Doe, John",30,Istanbul satırında ilk alan virgül içerdiği için tırnaklanmıştır; kurallara uygun bir ayrıştırıcı bunu üç alan (Doe, John, 30, Istanbul) olarak okumalıdır, dört değil. Alan içinde tırnak geçmesi gerektiğinde de aynı mantıkla "6"" TV" gibi bir yazım, alan değerinin aslında 6" TV olduğunu ifade eder.

Basit split(virgül) Yöntemi Neden Yetersiz Kalır?

Birçok geliştirici CSV'yi ayrıştırmak için satırı doğrudan virgülden bölmeyi (split(',')) dener. Bu yöntem tırnaksız, basit verilerde çalışır gibi görünür ama "Doe, John",30,Istanbul gibi bir satırda virgülü tırnak içindeki değerden ayırt edemez; tek alan olması gereken Doe, John ifadesini yanlışlıkla iki ayrı alana böler ve o satırdaki sütun sayısı kayar.

Aynı sorun satır içi yeni satırlar için de geçerlidir. Tırnaklanmış bir alan gerçek bir satır sonu (Enter) içerebilir; dosyayı satır satır okuyan bir ayrıştırıcı bu tek mantıksal kaydı iki ayrı satırmış gibi algılar ve veri bozulur. Doğru bir ayrıştırıcı, o an tırnak içinde olup olmadığını (durum bilgisini) takip ederek karakter karakter ilerlemelidir.

Ayraç (delimiter) da evrensel değildir. Türkçe ve birçok Avrupa dili yerel ayarında (locale), ondalık sayılar virgülle yazıldığı için (1,5) Excel bu bölgelerde CSV dışa aktarırken virgül yerine noktalı virgül (;) kullanır. Bir dosyayı açıp ilk satırın tek bir sütunmuş gibi göründüğünü fark ederseniz, büyük olasılıkla ayraç virgül değil noktalı virgüldür.

Uyarı
Bir CSV ayrıştırıcısını tek bir örnek dosyayla test edip "çalışıyor" diye üretime almak risklidir. Ayraç, kodlama ve tırnaklama varyasyonlarının hepsini kapsayan gerçek dünya verileriyle test etmeden, sadece kendi hazırladığınız temiz örneklerle sınamak, üretimde karşılaşacağınız bozuk satırları gizler.

CSV'den JSON'a: Başlık Satırı Obje Anahtarına Dönüşür

CSV'yi JSON'a çevirirken mantık nettir: ilk satırdaki her değer, oluşacak JSON dizisindeki nesnelerin bir anahtarı (key) olur. Sonraki her satır, bu anahtarlarla eşleşen değerlere sahip bir nesneye dönüşür. Böylece ad,yaş,şehir başlıklı bir CSV, her biri ad, yaş ve şehir anahtarlarını taşıyan bir nesne dizisine dönüşmüş olur.

Burada dikkat edilmesi gereken önemli bir nokta var: CSV kendi içinde tip bilgisi taşımaz, bu yüzden CSV'den JSON'a dönüşümde tüm değerler metin (string) olarak gelir; sayısal bir sütun bile JSON çıktısında tırnak içinde bir dize olarak görünür. Ters yönde, JSON'dan CSV'ye giderken de ilk nesnenin anahtarları başlık satırını oluşturur ve her değer yalnızca gerektiğinde (virgül, tırnak veya satır sonu içeriyorsa) tırnaklanır.

Sık Yapılan Hatalar

HataNeden Sorun Çıkarır
Kodlama (encoding) uyumsuzluğuExcel'in varsayılan CSV dışa aktarımı bazı sistemlerde UTF-8 yerine yerel bir kodlama kullanabilir; Türkçe karakterler (ı, ğ, ş, ö, ü, ç) bozuk görünür.
BOM (byte order mark) fark edilmemesiUTF-8 ile kaydedilen bazı CSV dosyaları başına görünmez bir BOM baytı ekler; bunu hesaba katmayan bir ayrıştırıcı ilk sütun adının başına gizli bir karakter sızdırabilir.
Tutarsız sütun sayısıBazı satırlarda başlıktan az ya da fazla değer bulunması, oluşan JSON nesnelerinde eksik veya kayık alanlara yol açar.
Sondaki boş satırlarDosya sonunda kalan boş satırlar, farkında olmadan JSON dizisine boş ya da anlamsız bir nesne olarak eklenebilir.
İpucu
Bir CSV dosyasını Excel yerine düz metin editöründe (VS Code, Notepad++) açıp ilk birkaç satırını kontrol etmek, ayraç ve kodlama sorunlarını dönüştürmeden önce fark etmenin en hızlı yoludur.

Bu kuralların tamamını elle kontrol etmek yerine, tırnaklama, kaçırılmış tırnaklar ve satır içi yeni satırları RFC 4180'e uygun şekilde işleyen bir araç kullanmak hem zaman kazandırır hem de veri kaybını önler.

WhatsApp