Ana içeriğe geç

Node.js CSV Okuma ve Yazma (node-csv ile)

Bu Rehberde Ne Öğreneceksiniz?

Bu rehber Node.js ile CSV dosyalarını verimli şekilde işlemeyi anlatır.
Büyük dosyalar için stream tabanlı okuma ve yazma yöntemlerini öğrenirsiniz.


Teknik Özet

  • Konu: Node.js CSV işlemleri
  • Problem: Büyük CSV dosyalarında bellek taşması
  • Çözüm: node-csv + stream kullanımı
  • Hedef: Ölçeklenebilir veri işleme

CSV Dosyaları Node.js’te Nasıl Kullanılır?

CSV dosyaları tablo verisi saklayan düz metin dosyalarıdır.
Alanlar genelde virgül ile ayrılır.

Node.js için birçok CSV kütüphanesi vardır.
node-csv, stream tabanlı yapısıyla büyük dosyalar için uygundur.


Proje Ortamını Hazırlama

mkdir csv_demo
cd csv_demo
npm init -y
npm install csv sqlite3
  • Bu komutlar proje klasörünü ve gerekli paketleri kurar.

CSV Modüllerini Kullanma


const { parse } = require("csv-parse");
const { stringify } = require("csv-stringify");
  • Bu modüller CSV okuma ve yazma işlemleri içindir.

CSV Dosyası Okuma (Stream ile)


const fs = require("fs");
const { parse } = require("csv-parse");

fs.createReadStream("data.csv")
.pipe(parse({ delimiter: ",", from_line: 2 }))
.on("data", (row) => {
console.log(row);
});
  • Bu kod CSV dosyasını satır satır okur.

CSV’yi Nesne Olarak Okuma


fs.createReadStream("data.csv")
.pipe(parse({ columns: true, trim: true }))
.on("data", (row) => {
console.log(row.year_month);
});
  • Bu ayar ilk satırı başlık olarak kullanır.

async/await ile Güvenli Okuma


async function oku() {
const parser = fs
.createReadStream("data.csv")
.pipe(parse({ columns: true }));

for await (const row of parser) {
console.log(row);
}
}
  • Bu yöntem backpressure sorunlarını önler.

CSV Dosyasına Yazma


const { stringify } = require("csv-stringify");
const fs = require("fs");

const stringifier = stringify({ header: true });
stringifier.pipe(fs.createWriteStream("output.csv"));

stringifier.write({ name: "Ali", age: 30 });
stringifier.end();
  • Bu kod JSON verisini CSV’ye yazar.

Veritabanından CSV Üretme


db.each("SELECT * FROM users", (err, row) => {
stringifier.write(row);
});
  • Bu yöntem veriyi belleğe almadan dışa aktarır.

Büyük Dosyalar İçin stream.pipeline


const { pipeline } = require("stream/promises");

await pipeline(
fs.createReadStream("input.csv"),
parse({ columns: true }),
stringify({ header: true }),
fs.createWriteStream("output.csv")
);
  • Bu yapı hata yönetimini otomatik yapar.

CSV → JSON Dönüşümü


fs.createReadStream("data.csv")
.pipe(parse({ columns: true }))
.pipe(JSONStream.stringify())
.pipe(fs.createWriteStream("data.json"));
  • Bu yöntem büyük dosyalar için uygundur.

JSON → CSV Dönüşümü


Readable.from(jsonArray)
.pipe(stringify({ header: true }))
.pipe(fs.createWriteStream("out.csv"));
  • Bu kod JSON dizisini CSV’ye çevirir.

  1. Hatalı Verileri Yönetme
  • Satır numarası ile log tutun

  • Hatalı satırları ayrı dosyaya yazın

  • Uygulamayı durdurmayın


Sıkça Sorulan Sorular

1. node-csv mi fast-csv mi? node-csv daha esnek yapı sunar.

2. Büyük dosyalar bloklar mı? Hayır, stream kullanılırsa bloklamaz.

3. Delimiter farklıysa ne yapmalıyım? delimiter: ";" gibi ayarlayın.

4. CSV’yi kütüphanesiz okuyabilir miyim? Önerilmez, edge-case’ler sorun çıkarır.


Sonuç

node-csv ile CSV dosyaları güvenli ve ölçeklenebilir şekilde işlenir. Stream yaklaşımı bellek kullanımını minimumda tutar.

Bu yapıyı Rabisu Bulut üzerinde yüksek hacimli veri işlerken rahatlıkla kullanabilirsiniz.