CSV to JSON JavaScript — Converter + Code Examples
Ücretsiz CSV'den JSON'a Dönüştürücü aracını doğrudan tarayıcınızda kullanın — kurulum gerektirmez.
CSV'den JSON'a Dönüştürücü Online Dene →Karşılaştığım CSV verilerinin büyük çoğunluğu dosya yükleme, veritabanı dışa aktarma veya hâlâ 1970'lerin formatını kullanan bir API'den düz string olarak gelir. JavaScript ile CSV'yi JSON'a dönüştürmek için dilin size ücretsiz verdiği iki şey yeterlidir: satırları ayrıştırmak için string bölme ve sonucu serileştirmek için JSON.stringify(). Temel işlemler için npm paketi gerekmez — bu kılavuz, yeniden kullanılabilir bir csvToJson() yardımcı fonksiyonundan PapaParse ve Node.js dosya G/Ç işlemlerine kadar tüm süreci kapsar. Kod yazmadan hızlı dönüşümler için çevrimiçi CSV'den JSON'a dönüştürücü bunu anında halleder. Tüm örnekler Node.js 18+ ve modern tarayıcıları hedefler.
- ✓CSV'yi satır sonuna göre böl, 0. satırdan başlıkları çıkar, kalan satırları nesnelere eşle, ardından düzenli çıktı için JSON.stringify(array, null, 2) kullan.
- ✓JSON.stringify() bir string üretir; JSON.parse() onu canlı bir JavaScript dizisine geri dönüştürür — üzerinde işlem yapmadan önce hangisine sahip olduğunu bil.
- ✓Map örnekleri otomatik olarak JSON'a serileştirilmez — önce Object.fromEntries(map) çağrısı yap.
- ✓Tırnak içi alanlar, değer içindeki virgüller veya hücrelerdeki satır sonları içeren CSV için manuel bölme yerine PapaParse veya csv-parse kullan.
- ✓csvtojson (npm), tür dönüşümü, akış ve RFC 4180 uç durumlarını tek bir çağrıda ele alır.
CSV'den JSON'a Dönüşüm Nedir?
CSV'den JSON'a dönüşüm, düz virgülle ayrılmış metin biçimini her satırın sütun başlıklarıyla anahtarlanmış bir JavaScript nesnesine dönüştüğü yapılandırılmış bir nesne dizisine dönüştürür. CSV biçiminin veri türü yoktur — her şey bir stringdir. JSON yapı, iç içe geçme ve açık türler (sayılar, boolean'lar, null) ekler. Bu dönüşüm, elektronik tablo dışa aktarması, eski sistem dökümü veya kullanıcı tarafından yüklenen dosyayla başlayan neredeyse her veri hattının ilk adımıdır. Temel veri aynı kalır; biçim konuma dayalı sütunlardan adlandırılmış özelliklere değişir.
name,email,role,active Ahmet Yılmaz,ahmet@nexuslabs.io,Mühendislik Lideri,true Fatma Demir,fatma@nexuslabs.io,Ürün Yöneticisi,true
[
{
"name": "Ahmet Yılmaz",
"email": "ahmet@nexuslabs.io",
"role": "Mühendislik Lideri",
"active": "true"
},
{
"name": "Fatma Demir",
"email": "fatma@nexuslabs.io",
"role": "Ürün Yöneticisi",
"active": "true"
}
]csvToJson() — Yeniden Kullanılabilir Dönüşüm Fonksiyonu Oluşturma
JavaScript'teki tam CSV'den JSON'a dönüşüm hattı üç adıma ayrılır: CSV stringini satır sonuna göre bölerek satırları alın, ilk satırdan başlıkları split(',') ile çıkarın, ardından kalan her satırı anahtarların başlıklardan, değerlerin karşılık gelen sütun konumlarından geldiği düz bir JavaScript nesnesine eşleyin. Son JSON.stringify() çağrısı bu nesne dizisini bir JSON string'e dönüştürür. İşte minimal çalışan bir sürüm:
function csvToJson(csv) {
const lines = csv.trim().split('\n')
const headers = lines[0].split(',').map(h => h.trim())
const rows = lines.slice(1)
.filter(line => line.trim() !== '')
.map(line => {
const values = line.split(',')
return Object.fromEntries(
headers.map((header, i) => [header, values[i]?.trim()])
)
})
return JSON.stringify(rows, null, 2)
}
const csv = `server,port,region,status
api-gateway,8080,us-east-1,healthy
auth-service,8443,eu-west-1,degraded
payments-api,9090,ap-south-1,healthy`
console.log(csvToJson(csv))
// [
// { "server": "api-gateway", "port": "8080", "region": "us-east-1", "status": "healthy" },
// { "server": "auth-service", "port": "8443", "region": "eu-west-1", "status": "degraded" },
// { "server": "payments-api", "port": "9090", "region": "ap-south-1", "status": "healthy" }
// ]Bu fonksiyon temel durumları ele alır: sondaki satır sonları, boş satırlar, değerlerin çevresindeki boşluklar. Her CSV alanı string olarak gelir. port değerinin sayı olan 8080 değil, string olan "8080" olduğuna dikkat edin. JSON çıktısında doğru türlere ihtiyacınız varsa bunları kendiniz dönüştürmeniz gerekir. İşte tür algılamalı genişletilmiş bir sürüm:
function coerceValue(val) {
if (val === undefined || val === '') return null
if (val === 'true') return true
if (val === 'false') return false
if (val === 'null') return null
const num = Number(val)
if (!isNaN(num) && val.trim() !== '') return num
return val
}
function csvToJson(csv, { coerce = false } = {}) {
const lines = csv.trim().split('\n')
const headers = lines[0].split(',').map(h => h.trim())
const rows = lines.slice(1)
.filter(line => line.trim() !== '')
.map(line => {
const values = line.split(',')
return Object.fromEntries(
headers.map((header, i) => [
header,
coerce ? coerceValue(values[i]?.trim()) : values[i]?.trim()
])
)
})
return JSON.stringify(rows, null, 2)
}
const csv = `endpoint,port,max_connections,debug
/api/v2/orders,8443,500,true
/api/v2/health,8080,100,false`
console.log(csvToJson(csv, { coerce: true }))
// [
// { "endpoint": "/api/v2/orders", "port": 8443, "max_connections": 500, "debug": true },
// { "endpoint": "/api/v2/health", "port": 8080, "max_connections": 100, "debug": false }
// ]coerce bayrağı isteğe bağlıdır çünkü otomatik tür algılama ters tepebilir — posta kodu gibi bir alan ("07302") sayıya dönüştürüldüğünde baştaki sıfırını kaybeder. Şemayı kontrol ettiğinizde dönüşümü yalnızca o zaman etkinleştirin. Kısa bir not: JSON.stringify() girinti için üçüncü bir space argümanı kabul eder. İki boşluk için 2, dört boşluk için 4 ya da sekme için "\t" geçin. Boşluğun bant genişliğini boşa harcadığı API istek gövdesi olarak JSON string gönderirken kompakt tek satır çıktı için tamamen belirtmeyin.
JSON.parse() çağrısını doğrudan CSV metnine uygulamak SyntaxError fırlatır. Önce CSV'yi csvToJson() fonksiyonunuzla JavaScript nesnelerine dönüştürmeniz gerekir; bu fonksiyon dahili olarak gerçek JSON string'ini üretmek için JSON.stringify() çağrısı yapar.CSV Verisinden Map, Date ve Özel Nesnelerin İşlenmesi
Her CSV dönüşümü düz nesnelerden oluşan bir diziyle bitmez. Bazen başlık-değer çiftlerinden bir Map oluşturmanız, tarih string'lerini Date nesnelerine ayrıştırmanız ya da serileştirmeden önce hesaplanmış özellikler eklemeniz gerekir. JavaScript'in insanları şaşırtan bir tuhaflığı vardır: Map örnekleri JSON.stringify() ile serileştirilmez. Boş bir nesne elde edersiniz. Çözüm, Map'i string'leştirmeden önce düz bir nesneye dönüştürmek için Object.fromEntries() kullanmaktır.
Map'in {} olarak serileştirilmesinin nedeni, JSON.stringify() fonksiyonunun bir nesnenin kendi numaralandırılabilir özellikleri üzerinde yinelemesidir. Bir Map, girişlerini nesne üzerinde numaralandırılabilir özellikler olarak değil dahili bir yuvada saklar; bu nedenle serileştirici anahtar içermeyen bir nesne görür. Map prototipi ayrıca toJSON() yönteminden de yoksundur; JSON.stringify() bir değeri nasıl serileştireceğine karar vermeden önce o değer üzerinde bu kancayı çağırır. Bir değerin toJSON() yöntemi varsa, serileştirilen şey nesnenin kendisi değil yöntemin dönüş değeridir. Bu nedenle Date nesneleri doğru şekilde serileştirilir: Date.prototype.toJSON bir ISO 8601 string'i döndürür; bu nedenle JSON.stringify(new Date()) boş nesne yerine tırnak içine alınmış bir zaman damgası üretir. Bu kancayı anlamak, aşağıdaki EmployeeRecord örneğinde gösterildiği gibi, kendi sınıflarınızda aynı davranışı tanımlamanıza olanak tanır — CSV'den türetilen hangi alanların nihai JSON çıktısında görüneceğini tam olarak kontrol etmek için.
Map'i JSON'a Dönüştürme
// CSV başlık→değer çiftlerinden bir Map oluştur
const headers = ['server', 'port', 'region']
const values = ['payments-api', '9090', 'ap-south-1']
const rowMap = new Map(headers.map((h, i) => [h, values[i]]))
// Map doğrudan serileştirilmez
console.log(JSON.stringify(rowMap))
// "{}" — boş nesne, veri kayboldu!
// Önce düz nesneye dönüştür
const rowObj = Object.fromEntries(rowMap)
console.log(JSON.stringify(rowObj, null, 2))
// {
// "server": "payments-api",
// "port": "9090",
// "region": "ap-south-1"
// }Tarih String'leri ve toJSON()
CSV tarih alanları string olarak gelir. Bunları işleme sırasında Date nesnelerine ayrıştırırsanız, Date'in yerleşik toJSON() yöntemi bir ISO 8601 string'i döndürdüğünden bu Date'ler doğru şekilde serileştirilir. Ayrıca kendi sınıflarınızda özel toJSON() tanımlayarak hangi CSV sütunlarının serileştirilen çıktıda görüneceğini kontrol edebilirsiniz — örneğin _rowIndex gibi dahili takip alanlarını dışarıda bırakmak için.
class EmployeeRecord {
constructor(csvRow) {
this._rowIndex = csvRow._rowIndex // dahili, JSON için değil
this.employeeId = csvRow.employee_id
this.name = csvRow.name
this.hiredAt = new Date(csvRow.hired_date)
this.salary = Number(csvRow.salary)
}
toJSON() {
// Yalnızca JSON çıktısında istediğimiz alanları göster
return {
employee_id: this.employeeId,
name: this.name,
hired_at: this.hiredAt, // Date.toJSON() → otomatik olarak ISO string
salary: this.salary,
}
}
}
const csvRow = {
_rowIndex: 42,
employee_id: 'EMP-2847',
name: 'Ahmet Yılmaz',
hired_date: '2024-03-15',
salary: '128000',
}
const record = new EmployeeRecord(csvRow)
console.log(JSON.stringify(record, null, 2))
// {
// "employee_id": "EMP-2847",
// "name": "Ahmet Yılmaz",
// "hired_at": "2024-03-15T00:00:00.000Z",
// "salary": 128000
// }
// Not: _rowIndex dışarıda bırakıldı, salary sayı, tarih ISO biçimindeTarih Seri Dışı Bırakma için Reviver
CSV'den türetilen JSON'u bir dosyaya yazdıktan veya ağ üzerinden gönderdikten sonra, JSON.parse() size düz nesneler döndürür — Date nesneleri yeniden string'e dönüşür. Ayrıştırma sırasında ISO 8601 string'lerini Date nesnelerine geri dönüştürmek için bir reviver fonksiyonu kullanın:
const jsonString = '{"employee_id":"EMP-2847","name":"Ahmet Yılmaz","hired_at":"2024-03-15T00:00:00.000Z","salary":128000}'
const isoDatePattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/
const parsed = JSON.parse(jsonString, (key, value) => {
if (typeof value === 'string' && isoDatePattern.test(value)) {
return new Date(value)
}
return value
})
console.log(parsed.hired_at instanceof Date) // true
console.log(parsed.hired_at.getFullYear()) // 2024JSON.stringify(), fonksiyon, Symbol veya undefined özellik içeren değerler için string yerine undefined döndürür. CSV'den türetilen nesneleriniz eksik bir sütundan yanlışlıkla undefined değeri alırsa, bu özellik JSON çıktısından sessizce kaybolur. Her zaman eksik değerleri null olarak varsayılan yapın.JSON.stringify() Parametre Referansı
Fonksiyon imzası: JSON.stringify(value, replacer?, space?). replacer ve space argümanlarının ikisi de isteğe bağlıdır — yalnızca girintiye ihtiyaç duyduğunuzda replacer için null geçin.
JSON.parse() parametreleri:
JSON.parse() — JSON Çıktısını Tüketme
csvToJson() fonksiyonundan bir JSON string aldıktan sonraki adım genellikle onu filtreleme, eşleme ya da bir API'ye besleme için canlı bir JavaScript dizisine geri ayrıştırmaktır. JSON string (typeof === "string") ile JavaScript nesnesi arasındaki fark önemlidir. Bir string üzerinde .filter() çağıramazsınız ya da [0].name ile erişemezsiniz — önce JSON.parse() gereklidir. Bu gidiş-dönüş (önce stringify, sonra parse) aynı zamanda bir doğrulama tekniği olarak da çalışır: CSV dönüşümünüz herhangi bir nedenle geçersiz JSON ürettiyse, parse bunu çökmeden yakalar. İsteğe bağlı reviver argümanı, ayrıştırma sırasında her anahtar-değer çiftini dönüştürmenize olanak tanır — ISO string'lerinden Date nesnelerini geri yüklemek veya ayrı bir geçiş gerektirmeden anahtarları yeniden adlandırmak için kullanışlıdır.
const csv = `endpoint,method,avg_latency_ms,error_rate
/api/v2/orders,POST,342,0.02
/api/v2/health,GET,12,0.00
/api/v2/payments,POST,890,0.15
/api/v2/users,GET,45,0.01`
// Adım 1: CSV'yi JSON string'e dönüştür
const jsonString = csvToJson(csv, { coerce: true })
// Adım 2: JavaScript dizisine geri ayrıştır
const endpoints = JSON.parse(jsonString)
// Dizi olduğunu doğrula
console.log(Array.isArray(endpoints)) // true
// Yüksek gecikmeli endpoint'leri filtrele
const slow = endpoints.filter(ep => ep.avg_latency_ms > 200)
console.log(slow.map(ep => ep.endpoint))
// ["/api/v2/orders", "/api/v2/payments"]
// İlk satırı yıkımlayarak al
const [first, ...rest] = endpoints
console.log(first.endpoint) // "/api/v2/orders"
console.log(rest.length) // 3Sonraki işleme başlamadan önce dönüşüm çıktısını doğrularken JSON.parse() için güvenli bir sarmalayıcı kullanışlıdır. CSV dönüşümü herhangi bir nedenle hatalı biçimli JSON üretirse (kısaltılmış girdi, kodlama hataları), bu çökmeden yakalar:
function safeParse(jsonString) {
try {
return { data: JSON.parse(jsonString), error: null }
} catch (err) {
return { data: null, error: err.message }
}
}
// Geçerli çıktı
const result = safeParse(csvToJson(csv))
if (result.error) {
console.error('CSV dönüşümü geçersiz JSON üretti:', result.error)
} else {
console.log(`${result.data.length} satır ayrıştırıldı`)
}
// Ham CSV'yi JSON.parse'a doğrudan geçirmek — bu başarısız olur
const bad = safeParse('name,email\nAhmet,ahmet@nexuslabs.io')
console.log(bad.error) // "Unexpected token 'a', "name,email"... is not valid JSON"Anahtar Yeniden Adlandırma ve Doğrulama için Reviver
Reviver fonksiyonu, ayrıştırma sırasında en içteki özelliklerden başlayarak dışa doğru her anahtar-değer çiftini alır. undefined döndürmek bir anahtarı sonuçtan tamamen kaldırır; farklı bir değer döndürmek onu değiştirir. Reviver, başlıkları yeniden adlandırmak (camelCase'den snake_case'e), dahili alanları temizlemek veya gerekli sütunların var olup olmadığını kontrol etmek için kullanışlıdır. Sonuncusu kök değerle çağrılır (boş string anahtarı); sonuç bir dizi değilse burada fırlatırsınız.
const jsonString = csvToJson(`employeeId,firstName,hiredDate
EMP-2847,Ahmet,2024-03-15
EMP-3012,Fatma,2023-11-01`, { coerce: false })
const camelToSnake = str => str.replace(/[A-Z]/g, c => '_' + c.toLowerCase())
const employees = JSON.parse(jsonString, function(key, value) {
// Kök değer — şekli doğrula
if (key === '') {
if (!Array.isArray(value)) throw new Error('CSV'den JSON dizisi beklendi')
return value
}
// camelCase başlık anahtarlarını snake_case'e dönüştür
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
return Object.fromEntries(
Object.entries(value).map(([k, v]) => [camelToSnake(k), v])
)
}
return value
})
console.log(employees[0])
// { employee_id: 'EMP-2847', first_name: 'Ahmet', hired_date: '2024-03-15' }Dosya ve API Yanıtından CSV Dönüştürme
Üretimde CSV verisinin gerçekten geldiği iki yer: diskteki dosyalar ve HTTP yanıtları. Her iki senaryo da hata yönetimi gerektirir çünkü girdi dışsaldır ve kontrolsüzdür.
CSV Dosyasını Oku, Dönüştür, JSON Yaz
import { readFileSync, writeFileSync } from 'node:fs'
function csvToJsonFromFile(inputPath, outputPath) {
let csvText
try {
csvText = readFileSync(inputPath, 'utf8')
} catch (err) {
throw new Error(`${inputPath} okunamadı: ${err.message}`)
}
const lines = csvText.trim().split('\n')
if (lines.length < 2) {
throw new Error(`${inputPath} içinde veri satırı yok (yalnızca ${lines.length} satır)`)
}
const headers = lines[0].split(',').map(h => h.trim())
const rows = lines.slice(1)
.filter(line => line.trim() !== '')
.map(line => {
const values = line.split(',')
return Object.fromEntries(headers.map((h, i) => [h, values[i]?.trim()]))
})
const jsonOutput = JSON.stringify(rows, null, 2)
writeFileSync(outputPath, jsonOutput, 'utf8')
console.log(`${rows.length} satır dönüştürüldü → ${outputPath}`)
return rows
}
// Kullanım
const data = csvToJsonFromFile('stok.csv', 'stok.json')
console.log(data[0])
// { sku: "WDG-2847", warehouse: "us-east-1", quantity: "150", ... }Bir API Endpoint'inden CSV Çekme
async function fetchCsvAsJson(url) {
const response = await fetch(url)
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`)
}
const contentType = response.headers.get('content-type') || ''
if (!contentType.includes('text/csv') && !contentType.includes('text/plain')) {
console.warn(`Beklenmeyen content-type: ${contentType}`)
}
const csvText = await response.text()
const lines = csvText.trim().split('\n')
const headers = lines[0].split(',').map(h => h.trim())
const rows = lines.slice(1)
.filter(line => line.trim() !== '')
.map(line => {
const values = line.split(',')
return Object.fromEntries(headers.map((h, i) => [h, values[i]?.trim()]))
})
return rows
}
// Örnek: bir veri sağlayıcısından döviz kuru CSV'si çek
try {
const rates = await fetchCsvAsJson('https://data.ecb.internal/rates/daily.csv')
console.log(JSON.stringify(rates.slice(0, 3), null, 2))
// Sonraki servise JSON olarak gönder
await fetch('https://api.internal/v2/rates', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ data: rates }),
})
} catch (err) {
console.error('Kur senkronizasyonu başarısız:', err.message)
}JSON.stringify() içindeki replacer argümanı, CSV'den belirli sütunları beyaz listeye almanıza olanak tanır. Yalnızca bu alanları dahil etmek için başlık adlarından oluşan bir dizi geçin: JSON.stringify(rows, ['name', 'email', 'department']). Dizide olmayan özellikler çıktıdan sessizce dışlanır.Komut Satırında CSV'den JSON'a Dönüştürme
Node.js satır içi betikler çalıştırabilir ve CSV'den JSON'a dönüşümü betik yazmadan gerçekleştiren özel CLI araçları da mevcuttur.
# CSV'yi bir Node.js satır içi betiğe aktar
cat servers.csv | node -e "
const lines = require('fs').readFileSync('/dev/stdin','utf8').trim().split('\n');
const h = lines[0].split(',');
const rows = lines.slice(1).map(l => Object.fromEntries(h.map((k,i) => [k.trim(), l.split(',')[i]?.trim()])));
console.log(JSON.stringify(rows, null, 2));
"# Miller yapılandırılmış veri için bir İsviçre çakısıdır # Kurulum: brew install miller (macOS) veya apt install miller (Debian/Ubuntu) mlr --icsv --ojson cat inventory.csv # Dönüştürme sırasında satırları filtrele mlr --icsv --ojson filter '$quantity > 100' inventory.csv # Belirli sütunları seç mlr --icsv --ojson cut -f sku,warehouse,quantity inventory.csv
# Küresel olarak kur npm install -g csvtojson # Dosyayı dönüştür csvtojson servers.csv > servers.json # Stdin'den aktar cat exports/q1-metrics.csv | csvtojson > q1-metrics.json
Büyük dosyalar için Miller genellikle csvtojson'a kıyasla daha iyi bir seçimdir. Miller C dilinde uygulanmıştır ve tüm dosyayı belleğe yüklemeden CSV'yi bir akış olarak işler; bu da gigabayt boyutundaki dışa aktarmaları sabit bellek kullanımıyla ele aldığı anlamına gelir. Ayrıca sütunları yeniden adlandırma, değerleri tür dönüştürme, satırları filtreleme gibi alan düzeyinde yerinde işlemleri de destekler — veri JSON'a dönüşmeden önce; böylece iki adımlı ayrıştırma-dönüştürme hattından kaçınırsınız. csvtojson ise Node.js'de çalışır ve araç zincirinin geri kalanı JavaScript ise daha uygundur: çıktısını doğrudan Node.js akışlarına aktarabilir, kütüphane olarak içe aktarabilir ya da koddaki sütun başına tür dönüşümü için colParser API'sini kullanabilirsiniz. Ham verim ve kabuk hatları için Miller'ı, Node.js uygulamasıyla sıkı entegrasyon gerektiğinde csvtojson'u tercih edin.
jq, CSV'yi doğrudan ayrıştırmaz. Hatta jq'yu hatta kullanmanız gerekiyorsa önce csvtojson veya mlr ile JSON'a dönüştürün, ardından JSON çıktısını filtreleme ve dönüşüm için jq'ya aktarın.Yüksek Performanslı Alternatif — PapaParse
Manuel split(',') yaklaşımı gerçek dünya CSV dosyalarında başarısız olur. Tırnak içi alanlar virgül, gömülü satır sonları, kaçınılmış çift tırnak içerir — bunların hepsi basit bir bölücüyü bozar. CSV bilinmeyen bir kaynaktan geldiğinde başvurduğum kütüphane PapaParse'dır. Her RFC 4180 uç durumunu ele alır, sınırlayıcıları otomatik algılar ve hem Node.js hem de tarayıcılarda çalışır.
npm install papaparse
import Papa from 'papaparse'
const csv = `product,description,price,in_stock
"Widget, Large","A premium widget with ""extra"" features",29.99,true
Bolt Assembly,Standard M8 bolt kit,4.50,true
"Gasket Set","Includes gasket, seal, and O-ring",12.75,false`
const { data, errors, meta } = Papa.parse(csv, {
header: true,
dynamicTyping: true, // sayıları ve boolean'ları otomatik dönüştür
skipEmptyLines: true,
transformHeader: h => h.trim().toLowerCase().replace(/\s+/g, '_'),
})
if (errors.length > 0) {
console.error('Ayrıştırma hataları:', errors)
}
console.log(JSON.stringify(data, null, 2))
// [
// {
// "product": "Widget, Large",
// "description": "A premium widget with \"extra\" features",
// "price": 29.99,
// "in_stock": true
// },
// ...
// ]
console.log(`${data.length} satır ayrıştırıldı, sınırlayıcı: "${meta.delimiter}"`)PapaParse'ın dynamicTyping seçeneği tür dönüşümünü otomatik olarak yapar — sayılar sayıya, "true"/"false" boolean'a dönüşür. transformHeader geri çağrısı sütun adlarını snake_case'e normalleştirir; bu da farklı CSV dışa aktarmalarından gelen tutarsız başlıklarla uğraşmaktan kurtarır. Herhangi bir ayrıştırma kodu yazmadan hızlı dönüşümler için CSV'den JSON'a dönüştürücü tarayıcıda bunların hepsini halleder.
Terminal Çıktısında Sözdizimi Vurgulama
Büyük bir JSON dizisini terminale dökmek gözleri yorar. Çıktıya sözdizimi vurgulama eklemek, hata ayıklama ve geliştirme sırasında okunabilirliği artırır. cli-highlight paketi, Node.js terminallerinde JSON çıktısını renklendirir.
npm install cli-highlight
import { highlight } from 'cli-highlight'
// CSV'yi JSON dizisine dönüştürdükten sonra
const jsonOutput = JSON.stringify(rows, null, 2)
// Sözdizimi vurgulama ile yazdır
console.log(highlight(jsonOutput, { language: 'json' }))
// Anahtarlar, string'ler, sayılar ve boolean'lar her biri farklı renk alırRenkli çıktı, büyük bir dönüşüm sonucunu etkileşimli olarak incelerken işe yarar. JSON anahtarları, string değerler, sayılar ve boolean'lar her biri farklı ANSI rengi alır; bu da türü yanlış olan bir alanı — örneğin dönüşüm kapalıyken string olarak vurgulanan bir port numarası — kolayca fark etmenizi sağlar. Bu özellikle sütun türlerinin satırlar arasında tutarsız olduğu elektronik tablo araçlarından dışa aktarılan CSV dosyalarında hata ayıklarken kullanışlıdır. Renk olmadan, 50 satır JSON'da yanlış türlenmiş tek bir alanı bulmak her değeri tek tek okumak anlamına gelir. Renkle, string renginde bir sayı hemen göze çarpar.
Büyük CSV Dosyalarıyla Çalışma
500 MB'lık bir CSV dosyasını readFileSync() ile bir string'e yüklemek belleği tüketir ve sürecinizin çökmesine neden olabilir. Büyük dosyalar için CSV'yi satır satır akıtın ve JSON nesnelerini geldikçe yayın. csv-parse paketi (npm'deki csv ekosisteminin bir parçası), Node.js akışlarıyla çalışan bir akış ayrıştırıcısı sağlar.
csv-parse ile CSV'yi NDJSON'a Akıtma
NDJSON (Satır Sınırlı JSON), çıktı dosyasının her satırının bağımsız bir JSON nesnesi olduğu bir biçimdir. Tek büyük bir JSON dizisinin aksine — ki bu okumaya başlamadan önce tüm dosyanın bellekte olmasını gerektirir — NDJSON dosyaları satır satır işlenebilir. Bu özelliği, günlük işlemciler, akış hatları veya toplu içe aktarma API'lerine sahip veritabanları tarafından tüketilecek büyük veri kümeleri için NDJSON'ı ideal hâle getirir. csv-parse paketi, nesne modunda CSV satırı başına bir JavaScript nesnesi yayar; böylece bunu her JSON.stringify(row) sonrasına \n ekleyen bir dönüşüm akışına doğrudan aktarabilirsiniz.
import { createReadStream, createWriteStream } from 'node:fs'
import { parse } from 'csv-parse'
import { Transform } from 'node:stream'
import { pipeline } from 'node:stream/promises'
// Her CSV satır nesnesini bir JSON satırına dönüştür
const toNdjson = new Transform({
objectMode: true,
transform(record, encoding, callback) {
callback(null, JSON.stringify(record) + '\n')
},
})
await pipeline(
createReadStream('telemetry-2026-03.csv'),
parse({
columns: true, // ilk satırı başlık olarak kullan
skip_empty_lines: true,
trim: true,
cast: true, // sayıları ve boolean'ları otomatik dönüştür
}),
toNdjson,
createWriteStream('telemetry-2026-03.ndjson')
)
console.log('Akış dönüşümü tamamlandı')
// Çıktı dosyasının her satırı bir JSON nesnesidir:
// {"timestamp":"2026-03-15T08:22:00Z","service":"gateway","latency_ms":42,"status":200}
// {"timestamp":"2026-03-15T08:22:01Z","service":"auth","latency_ms":156,"status":401}
// ...Tarayıcı ve Node.js için PapaParse Akışı
PapaParse'ın akış modu, tüm satırları bellekte toplamak yerine satır başına bir kez çağrılan bir step geri çağrısı kullanır. Bir Node.js ReadStream (Node.js'de) veya File nesnesi (tarayıcıda) geçersiniz ve PapaParse parçalama işlemini dahili olarak halleder. Bağlanacak akış hattı yoktur — yalnızca bir geri çağrı. csv-parse kullanmadan RFC 4180 uyumluluğuna ihtiyaç duyduğunuzda kullanın.
import Papa from 'papaparse'
import { createReadStream } from 'node:fs'
let rowCount = 0
const errors = []
const fileStream = createReadStream('depo-stok.csv')
Papa.parse(fileStream, {
header: true,
dynamicTyping: true,
step(result) {
// Bir seferde bir satır işle — sabit bellek
rowCount++
if (result.data.quantity === 0) {
errors.push(`Satır ${rowCount}: ${result.data.sku} stokta yok`)
}
},
complete() {
console.log(`${rowCount} satır işlendi`)
if (errors.length > 0) {
console.log(`Bulunan sorunlar: ${errors.length}`)
errors.forEach(e => console.log(` ${e}`))
}
},
error(err) {
console.error('Ayrıştırma başarısız:', err.message)
},
})Yaygın Hatalar
Sorun: CSV, JSON değildir. Ham bir CSV string'ini JSON.parse() fonksiyonuna geçirmek SyntaxError fırlatır çünkü virgüller ve satır sonları geçerli JSON sözdizimi değildir.
Çözüm: Önce CSV'yi split() veya bir kütüphane kullanarak JavaScript nesnelerine ayrıştırın, ardından JSON üretmek için JSON.stringify() kullanın. JSON.parse() yalnızca zaten geçerli JSON olan string'lerde çağırın.
const csv = 'name,email\nAhmet Yılmaz,ahmet@nexuslabs.io' const data = JSON.parse(csv) // SyntaxError: Unexpected token 'a'
const csv = 'name,email\nAhmet Yılmaz,ahmet@nexuslabs.io'
const lines = csv.trim().split('\n')
const headers = lines[0].split(',')
const rows = lines.slice(1).map(line =>
Object.fromEntries(headers.map((h, i) => [h, line.split(',')[i]]))
)
const json = JSON.stringify(rows, null, 2) // geçerli JSON stringSorun: Bir JavaScript nesnesi üzerinde toString() çağırmak, gerçek veriler yerine işe yaramaz '[object Object]' string'ini döndürür. Bu, CSV'den JSON'a çıktınızı sessizce yok eder.
Çözüm: JavaScript nesnelerini JSON string'e dönüştürmek için her zaman JSON.stringify() kullanın. toString() ilkel-string dönüşümü için vardır, serileştirme için değil.
const row = { server: 'api-gateway', port: 8080 }
const output = row.toString()
// "[object Object]" — veri kaybolduconst row = { server: 'api-gateway', port: 8080 }
const output = JSON.stringify(row, null, 2)
// '{"server":"api-gateway","port":8080}'Sorun: Basit split(",") kullanımı, CSV değerleri tırnak içi alanlarda virgül içerdiğinde bozulur: "Widget, Large" bir değer yerine iki ayrı değer olur.
Çözüm: Tam olarak kontrol etmediğiniz tüm CSV verileri için PapaParse veya csv-parse kullanın. Elle ayrıştırmanız gerekiyorsa, geçerli konumun tırnak içi bir alanda olup olmadığını izleyen bir durum makinesi ayrıştırıcısı uygulayın.
const line = '"Widget, Large","Premium quality",29.99'
const values = line.split(',')
// ["\"Widget", " Large\"", "\"Premium quality\"", "29.99"]
// 3 yerine 4 değer — ilk alan yanlış bölündüimport Papa from 'papaparse'
const { data } = Papa.parse('"Widget, Large","Premium quality",29.99')
// data[0] = ["Widget, Large", "Premium quality", "29.99"]
// 3 değer, doğru ayrıştırıldıSorun: Tür dönüşümü olmadan port: "8080", JSON'da sayı yerine string olarak kalır. Sayısal tür bekleyen aşağı akış sistemleri veriyi reddeder veya yanlış işler.
Çözüm: Eşleme adımı sırasında açık tür dönüşümü uygulayın ya da dynamicTyping: true ile PapaParse kullanın. Hangi alanların sayısal olması gerektiği konusunda her zaman bilinçli olun.
const row = { port: '8443', debug: 'true', workers: '4' }
JSON.stringify(row)
// {"port":"8443","debug":"true","workers":"4"} — hepsi stringconst row = {
port: Number('8443'), // 8443
debug: 'true' === 'true', // true
workers: Number('4'), // 4
}
JSON.stringify(row)
// {"port":8443,"debug":true,"workers":4} — doğru türlerManuel Ayrıştırma vs Kütüphaneler — Hızlı Karşılaştırma
CSV biçimini kontrol ettiğiniz ve tırnak içi alan olmadığını bildiğiniz hızlı betikler için yerleşik split() + JSON.stringify() yaklaşımı sıfır bağımlılıkla çalışır. Kullanıcı tarafından yüklenen CSV dosyalarını işleyen üretim sistemleri için tarayıcıda PapaParse veya Node.js'de csv-parse kullanın — her ikisi de RFC 4180'i doğru şekilde ele alır ve akışı destekler. csvtojson paketi, hem ayrıştırmayı hem de serileştirmeyi tek bir çağrıda yaparak doğrudan JSON çıktı veren tek pakettir. Yapıştır-sonuç'a en hızlı yoldan gitmek için CSV'den JSON'a dönüştürücü tarayıcıda herhangi bir kurulum gerektirmeden halleder.
Sık Sorulan Sorular
JavaScript ile kütüphane kullanmadan CSV nasıl JSON'a dönüştürülür?
CSV stringini satır sonuna göre bölerek satırları alın, ilk satırdan başlıkları split(",") ile çıkarın, ardından kalan satırları bu başlıkları anahtar olarak kullanan nesnelere eşleyin. Son olarak JSON.stringify(array, null, 2) ile biçimlendirilmiş bir JSON string üretin. Bu yaklaşım, biçimi kontrol ettiğiniz ve tırnak içi alan ya da gömülü virgül bulunmayan basit CSV dosyaları için iyi çalışır. Elektronik tablo dışa aktarmalarından veya üçüncü taraf sistemlerden gelen veriler için tırnak içi alanlar ve çok satırlı değerler basit bir bölücüyü bozar — bu durumlarda PapaParse veya csv-parse kullanın. Tarayıcıda işlenen çok küçük dosyalar için bu sıfır bağımlılıklı yaklaşım idealdir.
const csv = `name,email,department
Ahmet Yılmaz,ahmet@nexuslabs.io,Mühendislik
Fatma Demir,fatma@nexuslabs.io,Ürün`
const lines = csv.trim().split('\n')
const headers = lines[0].split(',')
const rows = lines.slice(1).map(line => {
const values = line.split(',')
return Object.fromEntries(headers.map((h, i) => [h.trim(), values[i]?.trim()]))
})
console.log(JSON.stringify(rows, null, 2))
// [
// { "name": "Ahmet Yılmaz", "email": "ahmet@nexuslabs.io", "department": "Mühendislik" },
// { "name": "Fatma Demir", "email": "fatma@nexuslabs.io", "department": "Ürün" }
// ]Nesneler için JSON.stringify() ile toString() arasındaki fark nedir?
Düz bir nesne üzerinde toString() çağırmak, gerçek veriler hakkında hiçbir şey söylemeyen "[object Object]" gibi işe yaramaz bir string döndürür. JSON.stringify() ise iç içe nesneler ve diziler de dahil olmak üzere tüm anahtarlar ve değerlerle birlikte geçerli bir JSON string üretir. CSV'den türetilen bir satırı JSON string'e dönüştürmeniz gerektiğinde her zaman JSON.stringify() kullanın. İşlemi tersine çevirmek için — bir JSON string'inden canlı JavaScript nesnelerini yeniden oluşturmak — JSON.stringify()'ın tam tersi olan JSON.parse() kullanın. Bu iki fonksiyon tam bir gidiş-dönüş oluşturur: veriyi kalıcı hâle getirmek veya iletmek için stringify, kullanmak için parse.
const row = { name: 'Ahmet Yılmaz', role: 'Mühendis' }
console.log(row.toString()) // "[object Object]"
console.log(JSON.stringify(row)) // '{"name":"Ahmet Yılmaz","role":"Mühendis"}'Virgül veya tırnak işareti içeren CSV alanları nasıl ele alınır?
RFC 4180, virgül, satır sonu veya çift tırnak içeren alanların çift tırnak içine alınması gerektiğini ve gömülü tırnak işaretlerinin ikiye katlanarak kaçınılması gerektiğini belirtir ("" tırnak içindeki alanda tek bir tırnak işaretini temsil eder). Manuel split(",") bu dosyalarda bozulur — alan sınırı artık düz bir virgül değildir. Üretim verisi için PapaParse veya csv-parse kullanın ya da tırnak içi bir alanda olup olmadığınızı takip eden bir durum makinesi ayrıştırıcısı yazın. Sıfırdan doğru bir durum makinesi yazmak şaşırtıcı derecede zordur: alanın başındaki tırnak işaretlerini, alan ortasındaki kaçış tırnak işaretlerini, tırnak içindeki satır sonlarını ve farklı satır sonu kurallarını (CRLF ve LF) ele almanız gerekir. Basit CSV verilerinin ötesindeki her şey için iyi test edilmiş bir kütüphane kullanın.
// PapaParse, RFC 4180'i doğru şekilde işler
import Papa from 'papaparse'
const csv = `product,description,price
"Widget, Large","A big ""widget""",29.99
Bolt,Standard bolt,1.50`
const { data } = Papa.parse(csv, { header: true })
console.log(JSON.stringify(data, null, 2))
// description alanı doğru şekilde içerir: A big "widget"CSV'yi doğrudan tarayıcıda JSON'a dönüştürebilir miyim?
Evet. JSON.stringify() ve JSON.parse() her tarayıcı motoruna yerleşik olarak gelir. CSV ayrıştırma adımı için basit dosyalarda satır sonu ve virgüle göre bölebilir ya da PapaParse'ı CDN üzerinden ekleyebilirsiniz (Node.js bağımlılığı yoktur). Dönüşümün tamamı istemci tarafında gerçekleşir ve sunucuya gidiş-dönüş gerekmez; bu da dosya gizliliği açısından kullanışlıdır — ham CSV verisi hiçbir zaman kullanıcının makinesini terk etmez. Kullanıcı bir <input type="file"> öğesi aracılığıyla CSV dosyası yüklediğinde, File API'nin file.text() yöntemi dosya içeriğini string olarak çözen bir Promise döndürür; bu stringi dönüşüm fonksiyonunuza geçirebilirsiniz. Bu, pano uygulamaları, geliştirici araçları ve arka uç olmadan yüklenen verileri işlemesi gereken her uygulama için tamamen tarayıcı içi CSV'den JSON'a dönüşümü pratik hâle getirir.
// Tarayıcı: kullanıcı bir CSV dosyası yükler
const fileInput = document.querySelector('input[type="file"]')
fileInput.addEventListener('change', async (event) => {
const file = event.target.files[0]
const text = await file.text()
const lines = text.trim().split('\n')
const headers = lines[0].split(',')
const rows = lines.slice(1).map(line =>
Object.fromEntries(headers.map((h, i) => [h.trim(), line.split(',')[i]?.trim()]))
)
console.log(JSON.stringify(rows, null, 2))
})CSV'deki sayısal ve boolean değerleri string yerine doğru türde nasıl ayrıştırırım?
CSV'nin tür sistemi yoktur — her alan bir stringdir. Değerleri eşleme adımında zorla dönüştürmeniz gerekir. Sayısal kalıpları Number() veya parseFloat() ile kontrol edin, "true"/"false" değerlerini boolean'a dönüştürün ve boş stringleri null olarak ele alın. Sayı gibi görünen ama string olarak kalması gereken alanlar konusunda dikkatli olun: "07302" gibi posta kodları Number() ile zorla dönüştürüldüğünde baştaki sıfırlarını kaybeder; sayısal karakterler içeren telefon numaraları veya ürün kodları da benzer şekilde kırılgandır. csvtojson kütüphanesi colParser seçeneği aracılığıyla otomatik tür dönüşümü yapar; bu seçenek, sütun başına dönüşüm fonksiyonları belirlemenize ve sorunlu sütunlar için otomatik algılamayı geçersiz kılmanıza olanak tanır. PapaParse'ın dynamicTyping seçeneği aynı dönüşümü tüm sütunlarda genel olarak uygular.
function coerceValue(val) {
if (val === '') return null
if (val === 'true') return true
if (val === 'false') return false
const num = Number(val)
if (!isNaN(num) && val.trim() !== '') return num
return val
}
// CSV'den nesneye eşleme sırasında uygula
const row = { port: coerceValue('8443'), debug: coerceValue('true'), host: coerceValue('api.internal') }
// { port: 8443, debug: true, host: "api.internal" }Node.js'de CSV'den JSON'a dönüştürme çıktısını dosyaya nasıl yazarım?
JSON.stringify() çıktısıyla birlikte fs.writeFileSync() kullanın. JSON.stringify'ın üçüncü argümanı girintiyi kontrol eder — iki boşluk için 2, sekme için "\t" geçin. Dosyayı geri okumak için JSON.parse(fs.readFileSync(path, "utf8")) kullanın; bu, canlı JavaScript nesne dizisini yeniden oluşturur. Dosyayı async bir bağlamda yazıyorsanız (async fonksiyon içinde veya ES modülünün üst düzeyinde), dosya yazma tamamlanırken olay döngüsünü bloke etmemek için fs.promises.writeFile() tercih edin. Birkaç megabaytı aşan büyük JSON çıktıları için, tüm stringi bellekte oluşturmadan önce bir WriteStream'e JSON akışı yazmayı düşünün.
import { writeFileSync, readFileSync } from 'node:fs'
// Yaz
const jsonOutput = JSON.stringify(rows, null, 2)
writeFileSync('calisanlar.json', jsonOutput, 'utf8')
// Geri oku
const parsed = JSON.parse(readFileSync('calisanlar.json', 'utf8'))
console.log(Array.isArray(parsed)) // true
console.log(parsed[0].name) // "Ahmet Yılmaz"İlgili Araçlar
Alex is a front-end and Node.js developer with extensive experience building web applications and developer tooling. He is passionate about web standards, browser APIs, and the JavaScript ecosystem. In his spare time he contributes to open-source projects and writes about modern JavaScript patterns, performance optimisation, and everything related to the web platform.
Sophie is a full-stack developer focused on TypeScript across the entire stack — from React frontends to Express and Fastify backends. She has a particular interest in type-safe API design, runtime validation, and the patterns that make large JavaScript codebases stay manageable. She writes about TypeScript idioms, Node.js internals, and the ever-evolving JavaScript module ecosystem.