Bloğa geri dön

Node-CSV kullanarak Node.js'de CSV Yönetimi

Node-CSV kullanarak Node.js'de CSV Yönetimi

Bir CSV dosyası, verileri tablo biçiminde saklayan düz bir metin dosyasıdır. Çoğu durumda, CSV dosyaları sınırlayıcı olarak virgül (,) kullanır, bu nedenle adı CSV (Virgülle Ayrılmış Değerler) olarak geçer. CSV’ler herhangi bir metin düzenleyici, elektronik tablo uygulamaları ve diğer özel araçlarla açılabildiğinden, veri uyumluluğunun önemli olduğu durumlarda kullanılır. Aslında birçok programlama dili CSV için yerleşik destek sunar.

Bu kılavuzda, örnek bir Node.js uygulamasında CSV kullanmayı öğreneceğiz.

Node.js'de CSV

Node.js, açık kaynaklı ve platformlar arası bir JavaScript çalışma ortamıdır. Tüm internet genelinde sayısız web hizmetine güç veren en popüler arka uçlardan biri haline gelmiştir. Netflix ve Uber gibi büyük şirketler bile hizmetlerine güç sağlamak için Node.js kullanmaktadır.

Node.js ayrıca bir projeye ekstra işlevsellik eklemek için dağıtılabilecek çok sayıda modüle sahiptir. CSV söz konusu olduğunda, kullanılabilecek birçok modül mevcuttur, örneğin, node-csv, fast-csv, ve papaparse vb.

Kılavuzun başlığından da anlaşılacağı gibi, node-csv kullanarak Node.js akışları (streams) ile CSV dosyalarını okuyacağız. Ayrıca ayrıştırılan verilerle çalışmayı, örneğin verileri bir SQLite veritabanına aktarmayı göstereceğiz.

Önkoşullar

Adım 1 – Gerekli Yazılımların Kurulması

Bu kılavuz için Ubuntu 22.04 LTS çalıştıran hafif bir sunucu oluşturdum (SSH üzerinden bağlı):

Şimdi, üzerine Node.js ve SQLite kuracağız.

  • Node.js LTS Kurulumu

Node.js doğrudan resmi Ubuntu paket depolarından edinilebilir. Ancak güncel sürüm değildir. Bu nedenle, en son Node.js paketlerini almak için üçüncü taraf bir depoya (Nodesource) başvuracağız.

Node.js LTS için depoyu ekleyin:

Şimdi, Node.js LTS'yi kurun:

  • SQLite Kurulumu

SQLite'ı doğrudan Ubuntu paket depolarından kuracağız. Aşağıdaki komutları çalıştırın:

Adım 2 – Proje Dizini Kurulumu

Bu bölümde projemiz için özel bir dizin hazırlayacağız. Ek modüllerle birlikte tüm proje dosyalarını barındıracaktır.

Yeni bir dizin oluşturun:

Dizine gidin:

Ardından, dizini bir npm projesi olarak bildirmek için aşağıdaki komutu çalıştırın:

Proje klasörü başlatıldıktan sonra, gerekli paketleri ve modülleri kurmaya başlayabiliriz. İlk olarak, node-csv:

node-csv modülü aslında diğer birkaç modülün birleşimidir: csv-generate, csv-parse (CSV dosyalarını ayrıştırma), csv-stringify (CSV'ye veri yazma) ve stream-transform.

Ardından, SQLite ile iletişim kurmak için gereken modüle ihtiyacımız var. Aşağıdaki komut şu modülü kuracaktır: node-sqlite3 modülü:

Projemiz için ihtiyacımız olan bileşen bir CSV dosyasıdır. Gösterim amacıyla, Yeni Zelanda göç CSV dosyasını kullanacağız:

Dosyanın içeriğine hızlıca bir göz atalım:

Burada,

  • İlk satır sütun adlarını tanımlar.

  • Sonraki satırlar bu alanların değerlerini içerir.

  • Her satır yeni bir satırla (\n) ayrılır.

  • Her veri noktası bir virgülle (,) ayrılır.

Ancak CSV, sınırlayıcı olarak yalnızca virgül kullanmakla sınırlı değildir. Diğer yaygın sınırlayıcılar arasında iki nokta üst üste (:), noktalı virgül (;) ve sekmeler (\td) bulunur.

Adım 3 – CSV Okuma

Bu bölümde, CSV dosyasındaki verileri okuyan ve ayrıştıran örnek bir programın uygulanmasını göstereceğiz.

Yeni bir JavaScript dosyası oluşturun:

Dosyayı favori metin düzenleyicinizde açın:

İlk olarak, fs ve csv-parse modüllerini içe aktaracağız:

Burada,

Ardından, CSV dosyasını okumak için kodlar ekleyeceğiz:

Burada,

  • fs modülünden createReadStream() yöntemini çağırıyoruz ve okumak istediğimiz CSV dosyasını argüman olarak iletiyoruz. Bu yöntem, büyük dosyayı daha küçük parçalara bölerek okunabilir bir akış oluşturur.

  • Akışı oluşturduktan sonra, pipe() yöntemi, akış verilerinin parçalarını başka bir akışa iletir. Bu yeni akış, parse() yönteminin csv-modülünden çağrılmasıyla oluşturulur.

  • The csv-modülü, bir veri parçasını alan ve onu başka bir forma dönüştüren okunabilir/yazılabilir bir dönüştürme (transform) akışı dağıtır.

  • The parse() yöntemi, özelliklere sahip nesneleri kabul eder. Nesne, ayrıştırılan verileri daha fazla işler. Burada nesne aşağıdaki özellikleri almaktadır:

    • delimiter: Değerleri ayırmak için kullanılacak sınırlayıcı karakter. Hedef CSV'miz durumunda bu virgüldür (,).

    • from_line: Ayrıştırıcının ayrıştırmaya başlayacağı satır sayısı. Verilen 2 değeriyle, ayrıştırıcı 1. satırı atlayacak ve 2. satırdan başlayacaktır. Bu düzenlemeyle, sütun adlarının ayrıştırılmış verilere dahil edilmesini önlemiş oluyoruz.

Ardından, Node.js'deki on() yöntemini kullanarak bir akış olayı ekleyeceğiz:

Burada,

  • Belirli bir olay yayınlandığında, bir akış olayı bir yöntemin bir veri parçasını tüketmesine olanak tanır.

  • When data parsed by parse() yöntemi tarafından ayrıştırılan veriler tüketilmeye hazır olduğunda, data olayını tetikler.

  • Verilere erişmek için, on() yöntemine bir row parametresi alan geri arama (callback) işlevi iletiyoruz.

  • row parametresi, bir dizi biçimindeki bir veri parçasıdır (ayrıştırma sonucu).

  • Son olarak, veriler console.log kullanılarak konsola kaydedilir.().

Programı tamamlamak için, hataları işlemek ve CSV dosyasındaki tüm veriler tüketildiğinde bir başarı mesajı yazdırmak üzere ek akış olayları ekleyeceğiz. Kodu aşağıdaki gibi güncelleyin:

Burada,

  • end olayı, CSV dosyasındaki tüm veriler tüketildiğinde tetiklenir. Bu, console.log() yönteminin çağrılmasıyla sonuçlanır ve bir başarı mesajı yazdırır.

  • error olayı, CSV verileri ayrıştırılırken bir hatayla karşılaşıldığında tetiklenir. Bu, console.log() yönteminin çağrılmasıyla sonuçlanır ve bir hata mesajı yazdırır.

Nihai kod şu şekilde görünmelidir:

Dosyayı kaydedin ve düzenleyiciyi kapatın. Artık programı yürütmeye hazırız. Node.js kullanarak çalıştırın:

Çıktı şuna benzer görünmelidir:

Verilerin tüketildiğini, dönüştürüldüğünü ve konsola yazdırıldığını unutmayın. Bu sürekli bir işlem olduğundan, çıktının tamamını tek seferde yazdırmak yerine veriler indiriliyormuş gibi görünecektir.

Adım 4 – CSV Verilerini Bir Veritabanına Aktarma

Şimdiye kadar, node-csv kullanarak bir CSV dosyasını nasıl ayrıştıracağımızı öğrendik. Bu bölüm, ayrıştırılan verilerin bir veritabanına (SQLite) aktarılmasını gösterecektir.

Veritabanıyla etkileşim kurmak için yeni bir JavaScript dosyası oluşturun:

Şimdi, dosyayı bir metin düzenleyicide açın:

Programımıza aşağıdaki kodlarla başlayacağız:

Burada,

  • İlk satırda, fs modülünü içe aktarıyoruz.

  • Üçüncü satırda, filepath değişkeni SQLite veritabanının yolunu içerir.

  • Bu noktada veritabanı henüz mevcut değildir. Ancak, node-sqlite3.

Ardından, SQLite veritabanına bir bağlantı kurmak için aşağıdaki satırları ekleyin:

Burada,

  • The method connectoToDatabase() metodu, veritabanına bir bağlantı kurar.

  • Within connectToDatabase() içinde, bir if ifadesi içinde fs modülünden existsSync() metodunu çağırıyoruz. If ifadesi, veritabanının belirtilen konumda var olup olmadığını kontrol eder.

    • Koşul değerlendirmesi true ise, o zaman Database() sınıfı, node-sqlite3 modülü üzerinden başlatılır. Bağlantı kurulduktan sonra, fonksiyon bir nesne döndürür ve sonlanır.

    • Koşul değerlendirmesi false (veritabanı mevcut değilse) ise, yürütme else bloğuna atlayacaktır. Orada, Database() sınıfı iki argümanla başlatılacaktır: veritabanı dosyasının yolu ve bir geri çağırma (callback) fonksiyonu.

Temel olarak, veritabanı mevcut değilse oluşturulacaktır. Ancak, oluşturma işlemi sırasında herhangi bir hata oluşursa, error nesnesini ayarlayacak ve hata mesajını yazdıracaktır.

Sırada, eğer bir veritabanı mevcut değilse tablo oluşturmak için kodları ekleyeceğiz:

Burada,

  • The connectToDatabase() fonksiyonu, createTable() fonksiyonunu çağırır; bu fonksiyon db içinde saklanan nesneleri bir argüman olarak kabul eder.

  • Outside connectToDatabase() dışında, createTable() metodunu, bağlantı nesnesi olan db nesnesini parametre olarak kabul edecek şekilde tanımladık.

  • The exec() metodu, db üzerinde bir SQL ifadesini argüman olarak alır. Bu SQL ifadesi içinde, migration tablosunun 7 sütunla oluşturulmasını tanımladık; buradaki her bir sütun migration_data.csv dosyasındaki sütun başlıklarına karşılık gelir.

  • Son olarak, şu fonksiyonu çağırıyoruz: connectToDatabase() yöntemi ve döndürdüğü bağlantı nesnesini diğer dosyalarda kullanabilmemiz için dışa aktarma.

Dosyayı kaydedin ve düzenleyiciyi kapatın.

Ardından, ayrıştırılan verileri veritabanına eklemek için başka bir program oluşturacağız:

Aşağıdaki kodu insert_data.js dosyasına girin::

Burada,

  • We are storing the connection object obtained from csv-to-sqlite3.js dosyasından elde edilen bağlantı nesnesini in the variable db değişkeninde saklıyoruz..

  • Veri olayı geri çağrısı içinde (fs modülü akışına bağlı), bağlantı nesnesi üzerinde serialize() yöntemini çağırıyoruz. Bu yöntem, bir SQL ifadesinin yürütülmesinin bir sonrakinin başlamasından önce tamamlanmasını sağlayarak veritabanı yarış durumlarını (sistemin eşzamanlı olarak rakip işlemleri çalıştırması) önler.

  • The serialize() yöntemi üç bağımsız değişken kabul eder:

    • İlk bağımsız değişken SQL ifadesidir.

    • İkinci bağımsız değişken bir dizidir.

    • Üçüncü bağımsız değişken, veriler veritabanına başarıyla eklendiğinde veya eklenemediğinde çalışan bir geri çağrıdır.

Programı yürütmeye hazırız. insert_data.js dosyasını Node.js kullanarak çalıştırın:

Sistemin performansına bağlı olarak işlemin tamamlanması biraz zaman alabilir. Ancak tamamlandığında çıktı şuna benzer görünmelidir:

Adım 5 – Verileri CSV'ye Yazma

Son bölümden sonra, migration_data.csv dosyasından ayrıştırdığımız tüm kayıtları içeren bir veritabanımız var. Bu bölümde, verileri veritabanından okuyacağız ve ayrı bir CSV dosyasına yazacağız.

Programı depolamak için yeni bir JavaScript dosyası oluşturun:

İlk olarak, fs ve csv-stringify modüllerini, csv-to-sqlite3.js dosyasındaki veritabanı bağlantı nesnesiyle birlikte içe aktarmak için aşağıdaki satırları ekleyin::

Ardından, yazılacak CSV dosyasının adını ve bir yazılabilir akışı (writable stream) içeren bir değişken ekleyeceğiz:

Burada,

  • The createWriteStream() yöntemi, yazılacak dosya adını bir argüman olarak alır. Dosyayı saved_from_db.csv olarak adlandıracağız..

  • The column değişkeni, CSV verileri için tüm başlık adlarını içeren bir diziyi depolar.

Ardından, veritabanından verileri okumak ve saved_from_db.csv dosyasına yazmak için aşağıdaki kod satırlarını ekleyin::

Burada,

  • We are invoking the stringify() yöntemini bir nesne argümanıyla çağırıyoruz. Bu, verileri bir nesneden CSV formatına dönüştüren bir dönüştürme akışı (transform stream) ile sonuçlanır. stringify() yöntemine iletilen nesnenin iki özelliği vardır:

    • header: Bir Boolean değeri kabul eder. Eğer değer true ise bir başlık oluşturulur.

    • columns: Eğer header değeri true ise, CSV dosyasının ilk satırına yazılacak sütun adlarını içeren bir diziyi kabul eder..

  • The each() yöntemi, csv-to-sqlite3 bağlantı nesnesinden iki argümanla çağrılır: SQL ifadesi (veritabanından veri okuma) ve bir geri çağırma (başarı/hata yönetimi).

  • Upon each iteration of each(), pipe() ( stringifier akışından gelen), verileri yığınlar halinde writableStream yazılabilir akışına göndermeye başlar. Her veri yığını daha sonra saved_from_db.csv dosyasına yazılır..

  • Tüm veriler CSV dosyasına yazıldığında, konsol ekranında bir başarı mesajı yazdırılır.

Son kod şu şekilde görünmelidir:

Dosyayı kaydedin ve editörü kapatın. Artık programı Node.js kullanarak çalıştırabiliriz:

Verilerin başarıyla dışa aktarıldığını doğrulamak için şu dosyanın içeriğini kontrol edin: saved_from_db.csv:

Son Düşünceler

Bu kılavuzda, node-csv ve node-sqlite3 modüllerini kullanarak Node.js'de CSV dosyalarıyla çalışmayı gösterdik. CSV'den verileri ayrıştırmak, verileri bir SQLite veritabanına aktarmak ve verileri yeni bir CSV dosyasına yazmak gibi çeşitli görevleri gerçekleştirmek için birden fazla program oluşturduk.

Bu kılavuz, node-csv modülünün yeteneklerinin yalnızca küçük bir kısmını göstermektedir. Tüm özellikleri hakkında daha fazla bilgiyi şurada bulabilirsiniz: CSV Project. node-sqlite3 hakkında daha fazla bilgi edinmek için GitHub'daki resmi belgelere göz atın. Bahsetmeye değer başka bir modül de event-stream akışlarla çalışmayı kolaylaştırmak içindir.

Node.js projenizi daha da büyütmek mi istiyorsunuz? İşte göz atmanız gereken bazı Node.js eğitimleri:

Keyifli Kodlamalar!

author

Preslav Dobrev

Yazar · CloudSigma

Preslav Dobrev, CloudSigma'da Kreatif Tasarımcı olarak görev yapmakta olup geleneksel ve yenilikçi pazarlama kanallarını kullanarak tutarlı bir kurumsal kimlik oluşturmaya odaklanmaktadır. Sanatsal vizyonu stratejik pazarlamayla harmanlayarak etkili marka anlatıları oluşturma konusunda oldukça yeteneklidir.

Yorumlar

Henüz yorum yapılmamış. İlk siz olun.