JSON Çıktısı
Örnek CSV’yi dönüştürmek şu çıktıyı üretir:
[
{
"name": "Alice Chen",
"email": "alice@example.com",
"role": "admin",
"active": true
},
{
"name": "Bob Martinez",
"email": "bob@example.com",
"role": "editor",
"active": true
},
{
"name": "Carol Williams",
"email": "carol@example.com",
"role": "viewer",
"active": false
}
]
İlk satır anahtarları oluşturur. Sonraki her satır bir nesne olur. active sütunundaki true ve false değerleri, boolean literal stringleriyle tam eşleştikleri için JSON booleanlarına dönüştürülür.
CSV Ayrıştırma Kuralları (RFC 4180)
RFC 4180 resmi CSV standardına en yakın belgedir. Temel kurallar:
- Alanlar virgüllerle ayrılır
- Her kayıt CRLF (
\r\n) ile biter, ancak çoğu ayrıştırıcı LF (\n) de kabul eder - Alanlar çift tırnak içine alınabilir; alıntılanmışsa, içindeki çift tırnak karakteri ikiye katlanarak kaçılır (
"") - İlk kayıt sütun adlarını içeren bir başlık satırı olabilir
- Tüm kayıtlar aynı sayıda alana sahip olmalıdır (ancak ayrıştırıcılar bunu ne kadar katı uyguladıkları konusunda farklılık gösterir)
Tırnaklı alanlar ve gömülü virgüller içeren uyumlu bir CSV:
id,description,tags
1,"Converts JSON, YAML, and CSV","data,tools"
2,"Supports ""quoted"" values","parsing"
- satırın ikinci sütunu virgül içerir. Üçüncü sütun virgül içerir. Her ikisi de geçerlidir çünkü alanlar çift tırnak içine alınmıştır. 2. satırın açıklamasındaki çift tırnak tek bir literal tırnağı temsil eder.
Tip Çıkarımı
CSV alanları format düzeyinde her zaman stringdir. Tipli JSON üreten bir dönüştürücü şu sırayla çıkarım yapar:
"42" -> 42 (geçerli integer)
"3.14" -> 3.14 (geçerli float)
"true" -> true (boolean literal)
"false" -> false (boolean literal)
"" -> null (boş alan)
"hello" -> "hello" (string olarak kalır)
Bu çoğu veri için işe yarar ancak şu durumlarda hatalı sonuç üretir:
- Başında sıfır olan posta kodları ve telefon numaraları (
073027302olur) - JavaScript’in güvenli integer aralığının üzerindeki büyük integerlar (2^53 üzerinde hassasiyet kaybı)
- String olarak istediğiniz bilimsel gösterim değerleri (
1e5100000olur) - Bilinçli olarak
"true"veya"null"değerini depolayan alanlar
Üretim veri boru hatları için dönüştürücünün tip çıkarımına güvenmeyin. Bilinen şemaya göre tip dönüşümünü uygulamanızda açıkça yapın.
CLI Alternatifleri
Bir betik veya boru hattında CSV’den JSON’a dönüştürme yapmanız gerektiğinde:
csvjson (csvkit’in parçası)
pip install csvkit
csvjson data.csv > data.json
csvjson --indent 2 data.csv > data.json
Python standart kütüphanesi
import csv
import json
with open("data.csv") as f:
reader = csv.DictReader(f)
data = list(reader)
print(json.dumps(data, indent=2))
csv.DictReader ilk satırı otomatik olarak anahtar olarak kullanır. Tüm değerler string olarak kalır (tip çıkarımı yok).
jq ile @csv
jq @csv kullanarak diğer yöne (JSON’dan CSV’ye) gidebilir, ancak CSV’den JSON’a en temiz yol Python veya csvkit’dir.
Kenar Durumları
BOM Karakterleri
Windows’ta Excel, UTF-8 BOM ile CSV dosyaları dışa aktarır (dosyanın başında EF BB BF bayt dizisi). Bu görünmez karakter ilk sütun başlığına eklenir. İlk anahtarınız first_name yerine \ufefffirst_name ise, ayrıştırmadan önce BOM’u kaldırın:
with open("data.csv", encoding="utf-8-sig") as f:
reader = csv.DictReader(f)
utf-8-sig kodeki BOM’u otomatik olarak kaldırır.
Tutarsız Sütun Sayıları
Bazı CSV dışa aktarıcıları, sondaki alanlar boşsa başlıktan daha az sütunlu satırlar üretir. RFC 4180 tutarlı sütun sayıları gerektirir, ancak gerçek dünya CSV’si karmaşıktır. Bir satır başlıktan daha az sütuna sahip olduğunda, eksik anahtarlar ayrıştırıcıya bağlı olarak ya null değer alır ya da tamamen atlanır.
Farklı Satır Sonları
Windows’tan CSV dosyaları CRLF (\r\n) kullanır. Unix/Mac dosyaları LF (\n) kullanır. Bazı ayrıştırıcılar \r karakterini her satırdaki son alanın değerinin bir parçası olarak işler. Son sütununuzda değerlerin sonunda satır başı karakteri varsa, kaynak dosyada Windows satır sonları vardır ve ayrıştırıcı bunu doğru işlemiyordur. Kontrol etmek için bir hex düzenleyicide açın veya file data.csv komutunu çalıştırın.