Node.js İle Csv Dosyalarından Veri Aktarım Sistemi Nasıl Yapılır?

Node.js İle Csv Dosyalarından Veri Aktarım Sistemi Nasıl Yapılır?
Node.js İle Csv Dosyalarından Veri Aktarım Sistemi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Node.js ile veri aktarım sistemi oluşturmaya başlamadan önce çalışma ortamınızın hazır olduğundan emin olmalısınız. 2026 yılı standartlarında, modern bir Node.js projesi için en az 20.x sürümünü kullanmanızı öneririm.

  • Node.js: LTS (Long Term Support) sürümü kurulu olmalıdır.
  • Paket Yöneticisi: npm veya pnpm kullanabilirsiniz.
  • CSV İşleme Kütüphanesi: Performans ve esneklik açısından csv-parser kütüphanesini tercih edeceğiz.
  • Veritabanı Sürücüsü: Örneğimizde PostgreSQL kullanacağız, bu yüzden pg paketine ihtiyacımız olacak.

Öncelikle çalışma dizininizi oluşturun ve gerekli paketleri yükleyin:

mkdir csv-aktarim-sistemi
cd csv-aktarim-sistemi
npm init -y
npm install csv-parser pg dotenv

Bu komutlar, projenizin temel yapısını oluşturacak ve veritabanı bağlantısı ile CSV okuma işlemleri için gerekli kütüphaneleri projenize dahil edecektir.

CSV Dosyası Okuma ve Stream Mantığı

CSV dosyalarını okurken tüm dosyayı belleğe (RAM) yüklemek, özellikle büyük dosyalarda uygulamanızın çökmesine neden olabilir. Bu yüzden "Stream" (akış) yapısını kullanmak kritik önem taşır. Node.js'in fs (File System) modülü ile dosyayı parça parça okuyarak işleyeceğiz.

const fs = require('fs');
const csv = require('csv-parser');

const sonuclariOku = (dosyaYolu) => {
  fs.createReadStream(dosyaYolu)
    .pipe(csv())
    .on('data', (row) => {
      console.log('İşlenen satır:', row);
    })
    .on('end', () => {
      console.log('CSV okuma işlemi başarıyla tamamlandı.');
    });
};

sonuclariOku('veriler.csv');

Yukarıdaki kod, dosyayı bir boru hattı (pipe) mantığıyla okur. data olayı her satır için tetiklenir, end olayı ise dosya bittiğinde çalışır.

Veritabanı Bağlantısı ve Güvenlik

Verileri aktarırken SQL Injection saldırılarına karşı korunmak için parametreli sorgular kullanmalısınız. Asla kullanıcıdan gelen veya dosyadan okunan veriyi doğrudan SQL sorgusunun içine gömmeyin.

const { Pool } = require('pg');
require('dotenv').config();

const pool = new Pool({
  connectionString: process.env.DATABASE_URL
});

const veriEkle = async (data) => {
  const query = 'INSERT INTO kullanicilar (ad, email) VALUES ($1, $2)';
  const values = [data.ad, data.email];
  
  try {
    await pool.query(query, values);
  } catch (err) {
    console.error('Veritabanı hatası:', err.message);
  }
};

Burada $1 ve $2 kullanımı, veritabanı sürücüsünün veriyi güvenli bir şekilde temizleyerek (sanitize) sorguya dahil etmesini sağlar.

Veri Doğrulama ve Hata Yönetimi

CSV dosyasındaki veriler her zaman beklediğiniz formatta olmayabilir. Bir veri aktarım sisteminin en önemli parçası, hatalı verileri ayıklayan bir doğrulama katmanıdır. Joi veya benzeri bir kütüphane ile verileri kontrol edebilirsiniz.

const veriDogrula = (row) => {
  if (!row.email || !row.email.includes('@')) {
    throw new Error('Geçersiz e-posta formatı');
  }
  return true;
};

Bu fonksiyonu, CSV'den gelen her satırı veritabanına göndermeden önce çalıştırarak hatalı kayıtların sisteme girmesini engelleyebilirsiniz.

Performanslı Aktarım İçin Yöntemlerin Karşılaştırılması

Yöntem Avantajı Dezavantajı
Stream (Akış) Düşük bellek kullanımı Karmaşık hata yönetimi
Batch Insert Yüksek hız Bellek tüketimi artabilir
Worker Threads CPU yoğun işlemlerde performans Kod karmaşıklığı

Kritik Güvenlik ve Uyarılar

Dikkat: Üretim ortamında (Production) çalışan sistemlerde, CSV dosyalarının içeriğini mutlaka bir "sandbox" ortamında veya geçici bir tabloda doğruladıktan sonra ana tabloya aktarın. Büyük dosyalar için "transaction" (işlem bloğu) kullanarak, bir hata durumunda tüm aktarımı geri almayı (rollback) unutmayın.

Sıkça Sorulan Sorular

Node.js ile 1GB üzeri CSV dosyası işlenebilir mi?

Evet, stream yapısını kullandığınız sürece Node.js belleği aşmadan 1GB ve daha büyük dosyaları satır satır işleyebilir.

Neden CSV yerine JSON kullanmıyoruz?

CSV, özellikle Excel ve eski sistemlerden veri dışa aktarımı için endüstri standardıdır ve çok daha az yer kaplar.

Hata durumunda aktarımı nasıl durdurabilirim?

Stream üzerinde .destroy() metodunu çağırarak veya try-catch blokları ile akışı keserek işlemi durdurabilirsiniz.

Veritabanı bağlantı havuzu (pool) neden gerekli?

Her satır için ayrı bir bağlantı açmak veritabanını yorar. Pool kullanımı, bağlantıları tekrar kullanarak performansı artırır.

CSV dosyası boşsa ne yapmalıyım?

Dosya okuma başlamadan önce fs.statSync ile dosya boyutunu kontrol ederek boş dosya durumlarını yönetebilirsiniz.

Büyük Ölçekli Veri İşleme İçin İleri Optimizasyon Teknikleri

Veri aktarım sisteminizde performans darboğazlarını aşmak için sadece stream yapısı yeterli olmayabilir. Özellikle veritabanı yazma işlemleri (INSERT) sırasında oluşan "I/O bekleme süresi", sistemin toplam çalışma süresini doğrudan etkiler. Bu noktada Batch Insert (Toplu Ekleme) stratejisi hayati önem taşır.

Her satırı tek tek veritabanına göndermek yerine, belirli bir sayıya (örneğin 500 veya 1000 satır) ulaştığında verileri tek bir sorgu ile göndermek, veritabanı üzerindeki yükü %80 oranında azaltabilir.

// Batch Insert mantığı örneği
const batchSize = 500;
let buffer = [];

stream.on('data', (row) => {
  buffer.push(row);
  if (buffer.length >= batchSize) {
    stream.pause(); // Veri akışını geçici olarak durdur
    db.query('INSERT INTO users (name, email) VALUES ?', [buffer], (err) => {
      buffer = [];
      stream.resume(); // Akışı devam ettir
    });
  }
});

Aktarım Süreçlerinde Hata Ayıklama ve Loglama Stratejileri

Üretim ortamında (production) çalışan bir veri aktarım sisteminde, hangi satırın neden başarısız olduğunu bilmek hata ayıklama süresini kısaltır. Standart console.log yerine, yapılandırılmış loglama kütüphaneleri (Winston veya Pino gibi) kullanmak, loglarınızı Elasticsearch veya CloudWatch gibi platformlara aktarmanıza olanak tanır.

Hatalı Satırları "Dead Letter" Dosyasına Ayırma

Veri doğrulama aşamasında başarısız olan satırları çöpe atmak yerine, bunları ayrı bir error_log.csv dosyasına yazarak daha sonra manuel inceleme yapabilirsiniz.

const fs = require('fs');
const errorStream = fs.createWriteStream('failed_rows.csv');

function logError(row, reason) {
  errorStream.write(`${JSON.stringify(row)}, Hata: ${reason}\n`);
}

// Kullanım örneği
if (!row.email.includes('@')) {
  logError(row, 'Geçersiz e-posta formatı');
  return;
}

Performans İzleme Tablosu

Yöntem Avantajı Dezavantajı
Tekli Insert Basit uygulama Çok yavaş, yüksek CPU kullanımı
Batch Insert Yüksek hız, düşük veritabanı yükü Bellek (RAM) kullanımı artabilir
Worker Threads Ana thread'i bloklamaz Karmaşık senkronizasyon

Sisteminizi ölçeklendirirken, Node.js'in tek thread yapısını unutmamalı; ağır veri dönüşüm işlemlerini (örneğin karmaşık string manipülasyonları) worker_threads modülü ile ana event loop'un dışına taşıyarak uygulamanızın yanıt verebilirliğini korumalısınız.

Sonuç

Node.js ile CSV veri aktarım sistemi kurmak, doğru kütüphaneleri seçmek ve stream mimarisini doğru uygulamakla başlar. Bu rehberde öğrendiğiniz yöntemlerle, güvenli ve performanslı bir entegrasyon süreci geliştirebilirsiniz. Bir sonraki adım olarak, bu işlemi bir "Cron Job" veya "Message Queue" (RabbitMQ/BullMQ) yapısına taşıyarak arka planda otomatik çalışan bir servis haline getirmeyi deneyebilirsiniz.

Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Yazılımlarınızın güvenliğini sağlamak ve veri bütünlüğünü korumak için üretim ortamına almadan önce kapsamlı testler yapmalı ve güncel güvenlik yamalarını takip etmelisiniz.

Bu yazıya tepkinizi paylaşın:
Selin Yılmaz

Sürdürülebilir yaşam ve pratik ev yönetimi üzerine içerik stratejileri geliştiriyorum. Yalın anlatımı ve uygulanabilirliği ön planda tutan bir yazı dilim var.

Yorumlar (0)

Yorum Yaz