Natrag na blog

Upravljanje CSV-om u Node.js-u pomoću Node-CSV-a

Upravljanje CSV-om u Node.js-u pomoću Node-CSV-a

A CSV datoteka je obična tekstualna datoteka koja pohranjuje podatke u tabličnom formatu. U većini slučajeva, CSV datoteke koriste zareze (,) kao graničnik, otuda i naziv CSV (Comma Separated Values). Koristi se u situacijama kada je kompatibilnost podataka važna jer se CSV datoteke mogu otvoriti bilo kojim uređivačem teksta, tabličnim aplikacijama i drugim specijaliziranim alatima. Zapravo, mnogi programski jezici nude ugrađenu podršku za CSV.

U ovom vodiču naučit ćemo o korištenju CSV-a u uzorku Node.js aplikacije.

CSV u Node.js

Node.js je open-source i višeplatformsko JavaScript runtime okruženje. Postao je jedan od najpopularnijih backendova koji pokreću brojne web usluge diljem interneta. Čak i velike tvrtke poput Netflixa i Ubera koriste Node.js za pokretanje svojih usluga.

Node.js također ima brojne module dostupne za implementaciju radi dodavanja dodatnih funkcionalnosti projektu. Kada je riječ o CSV-u, dostupni su mnogi moduli za korištenje, na primjer, node-csv, fast-csv, i papaparse itd.

Kao što naslov vodiča sugerira, koristit ćemo node-csv za čitanje CSV datoteka pomoću Node.js streamova. Također ćemo demonstrirati rad s analiziranim podacima, na primjer, prijenos podataka u SQLite bazu podataka.

Preduvjeti

Step 1 – Instalacija potrebnog softvera

Za ovaj vodič izradio sam lagani poslužitelj koji pokreće Ubuntu 22.04 LTS (povezan putem SSH-a):

Sada ćemo na njega instalirati Node.js i SQLite.

  • Instalacija Node.js LTS

Node.js je izravno dostupan iz službenih Ubuntu repozitorija paketa. Međutim, to nije najnovija verzija. Zato ćemo se osloniti na repozitorij treće strane (Nodesource) kako bismo dobili najnovije Node.js pakete.

Dodajte repozitorij za Node.js LTS:

Sada instalirajte Node.js LTS:

  • Instalirajte SQLite

Instalirat ćemo SQLite izravno iz Ubuntu repozitorija paketa. Pokrenite sljedeće naredbe:

Step 2 – Postavljanje direktorija projekta

U ovom odjeljku pripremit ćemo namjenski direktorij za naš projekt. On će sadržavati sve projektne datoteke zajedno s dodatnim modulima.

Stvorite novi direktorij:

Idite u direktorij:

Zatim pokrenite sljedeću naredbu kako biste deklarirali direktorij kao npm projekt:

Nakon što se inicijalizira mapa projekta, možemo početi instalirati potrebne pakete i module. Prvo ćemo instalirati node-csv:

Modul node-csv zapravo je zbirka nekoliko drugih modula: csv-generate, csv-parse (analiza CSV datoteka), csv-stringify (pisanje podataka u CSV) i stream-transform.

Zatim nam je potreban modul za komunikaciju s SQLite-om. Sljedeća naredba instalirat će node-sqlite3 modul:

Komponenta koja nam je potrebna za naš projekt je CSV datoteka. U svrhu demonstracije koristit ćemo CSV datoteku o migracijama na Novom Zelandu:

Pogledajmo na brzinu sadržaj datoteke:

Ovdje,

  • Prvi redak opisuje nazive stupaca.

  • Sljedeći redci sadrže vrijednosti za ova polja.

  • Svaki redak je odvojen novim retkom (\n).

  • Svaka podatkovna točka odvojena je zarezom (,).

Međutim, CSV nije ograničen na korištenje zareza kao graničnika. Ostali uobičajeni graničnici uključuju dvotočke (:), točke-zareze (;) i tabulatore (\td).

Korak 3 – Čitanje CSV-a

U ovom odjeljku demonstrirat ćemo implementaciju primjera programa koji čita i analizira podatke iz CSV datoteke.

Stvorite novu JavaScript datoteku:

Otvorite datoteku u svom omiljenom uređivaču teksta:

Najprije ćemo uvesti fs i csv-parse module:

Ovdje,

  • Prvo, varijabli fs dodjeljuje se objekt fs koji vraća Node.js require() metodu nakon uvoza modula.

  • Zatim se metoda parse izdvaja iz objekta koji vraća require() metoda u varijavlu parse pomoću sintakse destrukturiranja.

Zatim ćemo dodati kod za čitanje CSV datoteke:

Ovdje,

  • Pozivamo createReadStream() iz modula fs i prosljeđujemo CSV datoteku koju želimo čitati kao argument. Zatim stvara čitljivi tok dijeljenjem veće datoteke na manje dijelove.

  • Nakon stvaranja toka, metoda pipe() prosljeđuje dijelove podataka toka u drugi tok. Ovaj novi tok stvara se nakon pozivanja metode parse() metode iz csv-modula.

  • The csv-modul pokreće čitljiv/zapisiv transformacijski tok koji uzima dio podataka i pretvara ga u drugi oblik.

  • Metoda parse() prihvaća objekte sa svojstvima. Objekt dalje obrađuje analizirane podatke. Ovdje objekt uzima sljedeća svojstva:

    • delimiter: Znak graničnika za razdvajanje vrijednosti. U slučaju našeg ciljnog CSV-a, to je zarez (,).

    • from_line: Broj redaka od kojeg će parser započeti analizirati. S obzirom na vrijednost 2, parser će preskočiti 1. redak i započeti na 2. retku. Ovim rasporedom izbjegavamo integraciju naziva stupaca u analizirane podatke.

Zatim ćemo priložiti događaj toka pomoću metode on() iz Node.js-a:

Ovdje,

  • Nakon emitiranja određenog događaja, događaj toka omogućuje metodi da konzumira dio podataka.

  • Kada su podaci koje je analizirala metoda parse() spremni za konzumaciju, to pokreće data događaj.

  • Za pristup podacima, prosljeđujemo povratni poziv metodi on() koja prima parametar row.

  • Parametar row je dio podataka u obliku niza (rezultat analize).

  • Na kraju, podaci se ispisuju u konzoli pomoću console.log().

Za dovršetak programa, dodat ćemo dodatne događaje toka za rukovanje pogreškama i ispis poruke o uspjehu kada se svi podaci u CSV datoteci potroše. Ažurirajte kod na sljedeći način:

Ovdje,

  • Događaj end se emitira kada se potroše svi podaci u CSV datoteci. To rezultira pozivanjem console.log() metode koja ispisuje poruku o uspjehu.

  • Događaj error se emitira kada dođe do pogreške tijekom parsiranja CSV podataka. To rezultira pozivanjem console.log() metode koja ispisuje poruku o pogrešci.

Konačni kod bi trebao izgledati ovako:

Spremite datoteku i zatvorite uređivač. Sada smo spremni za izvršavanje programa. Pokrenite ga koristeći Node.js:

Izlaz bi trebao izgledati otprilike ovako:

Imajte na umu da se podaci troše, transformiraju i ispisuju na konzoli. Budući da je to kontinuirani proces, izgledat će kao da se podaci preuzimaju, a ne da se ispisuje cijeli izlaz odjednom.

Korak 4 – Prijenos CSV podataka u bazu podataka

Do sada smo naučili kako parsirati CSV datoteku koristeći node-csv. Ovaj odjeljak će prikazati prijenos parsiranih podataka u bazu podataka (SQLite).

Stvorite novu JavaScript datoteku za interakciju s bazom podataka:

Sada otvorite datoteku u uređivaču teksta:

Započet ćemo naš program sa sljedećim kodom:

Ovdje,

  • U prvom retku uvozimo fs modul.

  • U trećem retku, varijabla filepath sadrži putanju do SQLite baze podataka.

  • U ovom trenutku baza podataka još ne postoji. Međutim, bit će potrebna pri radu s node-sqlite3.

Zatim dodajte sljedeće retke kako biste uspostavili vezu s SQLite bazom podataka:

Ovdje,

  • Metoda connectoToDatabase() uspostavlja vezu s bazom podataka.

  • Unutar connectToDatabase(), pozivamo existsSync() metodu iz modula fs unutar if naredbe. If naredba provjerava postojanje baze podataka na navedenoj lokaciji.

    • Ako je procjena uvjeta true, tada se Database() klasa iz node-sqlite3 modula inicijalizira. Nakon što se veza uspostavi, funkcija vraća objekt i završava.

    • Ako je procjena uvjeta false (baza podataka ne postoji), tada će se izvršavanje prebaciti na else blok. Tamo će se Database() klasa inicijalizirati s dva argumenta: putanjom do datoteke baze podataka i povratnim pozivom.

Uglavnom, baza podataka će se kreirati ako ne postoji. Međutim, ako dođe do bilo kakve pogreške tijekom procesa kreiranja, postavit će se error objekt i ispisati poruka o pogrešci.

Zatim ćemo uvesti kod za kreiranje tablice ako baza podataka ne postoji:

Ovdje,

  • Funkcija connectToDatabase() poziva createTable() funkciju koja prihvaća objekte pohranjene u db kao argument.

  • Izvan connectToDatabase(), definirali smo createTable() metodu koja prihvaća objekt veze db kao parametar.

  • Metoda exec() na db prima SQL naredbu kao argument. Unutar ove SQL naredbe definirali smo kreiranje tablice migration sa 7 stupaca, pri čemu svaki stupac odgovara zaglavljima stupaca u migration_data.csv datoteci.

  • Na kraju, pozivamo connectToDatabase() metodu i izvozimo objekt veze koji ona vraća kako bismo ga mogli koristiti u drugim datotekama.

Spremite datoteku i zatvorite uređivač.

Zatim ćemo stvoriti još jedan program za umetanje analiziranih podataka u bazu podataka:

Unesite sljedeći kod u insert_data.js:

Ovdje,

  • Spremamo objekt veze dobiven iz csv-to-sqlite3.js u varijablu db.

  • Unutar povratnog poziva događaja data (povezanog s tokom modula fs), pozivamo serialize() metodu na objektu veze. Ona osigurava da se jedna SQL naredba završi s izvršavanjem prije nego što započne sljedeća, sprječavajući utrke u bazi podataka (sustav koji istovremeno izvodi konkurentne operacije).

  • Metoda serialize() prihvaća tri argumenta:

    • Prvi argument je SQL naredba.

    • Drugi argument je niz.

    • Treći argument je povratni poziv koji se pokreće kada se podaci uspješno ili neuspješno umetnu u bazu podataka.

Spremni smo za izvršavanje programa. Pokrenite insert_data.js pomoću Node.js-a:

Ovisno o performansama sustava, proces može potrajati neko vrijeme. Međutim, nakon završetka, izlaz bi trebao izgledati otprilike ovako:

Korak 5 – Zapisivanje podataka u CSV

Nakon prošlog odjeljka imamo bazu podataka koja sadrži sve zapise koje smo analizirali iz migration_data.csv. U ovom odjeljku pročitat ćemo podatke iz baze podataka i zapisati ih u zasebnu CSV datoteku.

Stvorite novu JavaScript datoteku za pohranu programa:

Prvo dodajte sljedeće retke za uvoz fs i csv-stringify  zajedno s objektom baze podataka iz csv-to-sqlite3.js:

Zatim ćemo dodati varijablu koja sadrži naziv CSV datoteke u koju se piše, zajedno s tokom za pisanje:

Ovdje,

  • Metoda createWriteStream() prima naziv datoteke u koju se piše kao argument. Datoteku ćemo nazvati saved_from_db.csv.

  • Varijabla column pohranjuje niz koji sadrži sve nazive zaglavlja za CSV podatke.

Zatim dodajte sljedeće linije koda kako biste pročitali podatke iz baze podataka i zapisali ih u saved_from_db.csv:

Ovdje,

  • Pozivamo metodu stringify() s objektom kao argumentom. To rezultira transformacijskim tokom (transform stream) koji pretvara podatke iz objekta u CSV format. Objekt proslijeđen metodi stringify() ima dva svojstva:

    • header: Prihvaća Booleovu vrijednost. Ako je vrijednost true, tada se generira zaglavlje.

    • columns: Prihvaća niz koji sadrži nazive stupaca koji će se zapisati u prvu liniju CSV datoteke ako header je true.

  • Metoda each() iz objekta veze csv-to-sqlite3 poziva se s dva argumenta: SQL naredbom (čitanje podataka iz baze podataka) i povratnim pozivom (koji rukuje uspjehom/pogreškom).

  • Pri svakoj iteraciji metode each(), pipe() (iz toka stringifier stream) počinje slati podatke u dijelovima u tok za pisanje writableStream. Svaki dio podataka se zatim zapisuje u saved_from_db.csv.

  • Kada se svi podaci zapišu u CSV datoteku, na zaslonu konzole ispisuje se poruka o uspjehu.

Konačni kod bi trebao izgledati ovako:

Spremite datoteku i zatvorite uređivač. Sada možemo pokrenuti program koristeći Node.js:

Kako biste potvrdili jesu li podaci uspješno izvezeni, provjerite sadržaj saved_from_db.csv:

Završne misli

U ovom smo vodiču prikazali rad s CSV datotekama u Node.js-u koristeći module node-csv i node-sqlite3. Stvorili smo više programa za postizanje različitih zadataka, na primjer, parsiranje podataka iz CSV-a, unos podataka u SQLite bazu podataka i pisanje podataka u novu CSV datoteku.

Ovaj vodič prikazuje samo mali dio mogućnosti node-csv modula. Saznajte više o svim njegovim značajkama na CSV Project. Da biste saznali više o node-sqlite3, pogledajte službenu dokumentaciju na GitHubu. Još jedan modul vrijedan spomena je event-stream za pojednostavljenje rada s tokovima.

Zanima vas daljnji razvoj vašeg Node.js projekta? Evo nekoliko Node.js vodiča koje biste trebali pogledati:

Sretno kodiranje!

author

Preslav Dobrev

Autor · CloudSigma

Preslav Dobrev je kreativni dizajner u CloudSigma, usredotočen na dosljedan poslovni identitet korištenjem tradicionalnih i inovativnih marketinških kanala. Vješt je u spajanju umjetničke vizije sa strateškim marketingom kako bi stvorio dojmljive brendirane priče.

Komentari

Još nema komentara. Budite prvi.