Späť na blog

Správa CSV v Node.js pomocou Node-CSV

Správa CSV v Node.js pomocou Node-CSV

Súbor CSV je čistý textový súbor, ktorý ukladá údaje v tabuľkovom formáte. Vo väčšine prípadov súbory CSV používajú ako oddeľovač čiarky (,), odtiaľ pochádza aj názov CSV (Comma Separated Values). Používa sa v situáciách, keď ide o kompatibilitu údajov, pretože súbory CSV je možné otvoriť v akomkoľvek textovom editore, tabuľkovom procesore a iných špecializovaných nástrojoch. Mnohé programovacie jazyky dokonca ponúkajú vstavanú podporu pre CSV.

V tomto návode sa dozvieme o používaní CSV v ukážkovej Node.js aplikácii.

CSV v Node.js

Node.js je open-source a multiplatformové runtime prostredie pre JavaScript. Stalo sa jedným z najpopulárnejších backendov, ktoré poháňajú množstvo webových služieb po celom internete. Dokonca aj veľké spoločnosti ako Netflix a Uber používajú Node.js na pohon svojich služieb.

Node.js má tiež k dispozícii množstvo modulov, ktoré je možné nasadiť na pridanie ďalších funkcií do projektu. Pokiaľ ide o CSV, k dispozícii je mnoho modulov, napríklad node-csv, fast-csv, a papaparse atď.

Ako napovedá názov návodu, budeme používať node-csv na čítanie CSV súborov pomocou streamov Node.js. Ukážeme si tiež prácu s analyzovanými dátami, napríklad prenos dát do SQLite databázy.

Požiadavky

Krok 1 – Inštalácia potrebného softvéru

Pre tento návod som vytvoril ľahký server so systémom Ubuntu 22.04 LTS (pripojený cez SSH):

Teraz naň nainštalujeme Node.js a SQLite.

  • Inštalácia Node.js LTS

Node.js je priamo dostupný z oficiálnych repozitárov balíkov Ubuntu. Nie je to však najnovšia verzia. Preto sa spoľahneme na repozitár tretej strany (Nodesource) na získanie najnovších balíkov Node.js.

Pridajte repozitár pre Node.js LTS:

Teraz nainštalujte Node.js LTS:

  • Inštalácia SQLite

SQLite budeme inštalovať priamo z repozitárov balíkov Ubuntu. Spustite nasledujúce príkazy:

Krok 2 – Nastavenie adresára projektu

V tejto časti pripravíme vyhradený adresár pre náš projekt. Budú v ňom uložené všetky súbory projektu spolu s ďalšími modulmi.

Vytvorte nový adresár:

Prejdite do adresára:

Potom spustením nasledujúceho príkazu deklarujte adresár ako npm projekt:

Po inicializácii priečinka projektu môžeme začať inštalovať potrebné balíky a moduly. Najprv nainštalujeme node-csv:

Modul node-csv je v skutočnosti kolekcia niekoľkých ďalších modulov: csv-generate, csv-parse (analýza CSV súborov), csv-stringify (zápis dát do CSV) a stream-transform.

Ďalej potrebujeme modul na komunikáciu s SQLite. Nasledujúci príkaz nainštaluje modul node-sqlite3 modul:

Komponent, ktorý pre náš projekt potrebujeme, je CSV súbor. Na demonštračné účely použijeme CSV súbor o migrácii na Novom Zélande:

Pozrime sa v rýchlosti na obsah súboru:

Tu,

  • Prvý riadok popisuje názvy stĺpcov.

  • Nasledujúce riadky obsahujú hodnoty pre tieto polia.

  • Každý riadok je oddelený novým riadkom (\n).

  • Každý údaj je oddelený čiarkou (,).

CSV sa však neobmedzuje len na používanie čiarok ako oddeľovača. Medzi ďalšie bežné oddeľovače patria dvojbodky (:), bodkočiarky (;) a tabulátory (\td).

Krok 3 – Čítanie CSV

V tejto časti si ukážeme implementáciu ukážkového programu, ktorý číta a analyzuje dáta zo súboru CSV.

Vytvorte nový JavaScript súbor:

Otvorte súbor vo svojom obľúbenom textovom editore:

Najprv naimportujeme fs a csv-parse moduly:

Tu,

  • Najprv sa do premennej fs priradí objekt fs, ktorý vracia metóda Node.js require() pri importe modulu.

  • Potom sa metóda parse extrahuje z objektu vráteného metódou require() do premennej parse pomocou syntaxe deštrukturalizácie.

Ďalej pridáme kód na čítanie súboru CSV:

Tu,

  • Voláme metódu createReadStream() z modulu fs a ako argument odovzdávame CSV súbor, ktorý chceme čítať. Ten potom vytvorí čitateľný stream rozdelením väčšieho súboru na menšie časti.

  • Po vytvorení streamu metóda pipe() presmeruje časti dát streamu do iného streamu. Tento nový stream sa vytvorí po zavolaní metódy parse() z modulu csv-module.

  • Modul csv-module využíva čitateľný/zapisovateľný transformačný stream, ktorý prevezme časť dát a transformuje ju do inej podoby.

  • Metóda parse() prijíma objekty s vlastnosťami. Objekt ďalej spracováva analyzované dáta. V tomto prípade objekt preberá nasledujúce vlastnosti:

    • delimiter: Znak oddeľovača na oddelenie hodnôt. V prípade nášho cieľového CSV je to čiarka (,).

    • from_line: Číslo riadku, od ktorého parser začne analýzu. Pri zadanej hodnote 2 parser preskočí 1. riadok a začne na 2. riadku. Týmto usporiadaním zabránime tomu, aby sa názvy stĺpcov začlenili do analyzovaných dát.

Ďalej pripojíme udalosť streamu pomocou metódy on() z Node.js:

Tu,

  • Po vyvolaní určitej udalosti umožňuje udalosť streamu metóde spracovať časť dát.

  • Keď sú dáta analyzované metódou parse() pripravené na spracovanie, spustí sa udalosť data event.

  • Na prístup k dátam odovzdávame metóde on() spätnú väzbu (callback), ktorá prijíma parameter row.

  • Parameter row je časť dát vo forme poľa (výsledok analýzy).

  • Nakoniec sa dáta zapíšu do konzoly pomocou console.log().

Na dokončenie programu pridáme ďalšie udalosti streamu na spracovanie chýb a vypísanie správy o úspechu, keď sa spotrebujú všetky dáta v súbore CSV. Aktualizujte kód nasledovne:

Tu,

  • Udalosť end sa vyvolá, keď sa spracujú všetky údaje v súbore CSV. Výsledkom je volanie console.log() metódy, ktorá vytlačí správu o úspechu.

  • Udalosť error sa vyvolá, keď sa vyskytne chyba pri analýze údajov CSV. Výsledkom je volanie console.log() metódy, ktorá vytlačí chybovú správu.

Finálny kód by mal vyzerať takto:

Uložte súbor a zatvorte editor. Teraz sme pripravení spustiť program. Spustite ho pomocou Node.js:

Výstup by mal vyzerať približne takto:

Upozorňujeme, že údaje sa spracovávajú, transformujú a vypisujú do konzoly. Keďže ide o nepretržitý proces, bude to vyzerať, akoby sa údaje sťahovali, namiesto toho, aby sa celý výstup vypísal naraz.

Krok 4 – Prenos údajov CSV do databázy

Doteraz sme sa naučili, ako analyzovať súbor CSV pomocou node-csv. Táto časť ukáže prenos analyzovaných údajov do databázy (SQLite).

Vytvorte nový súbor JavaScript na interakciu s databázou:

Teraz otvorte súbor v textovom editore:

Náš program začneme s nasledujúcim kódom:

Tu,

  • Na prvom riadku importujeme fs modul.

  • Na treťom riadku premenná filepath obsahuje cestu k databáze SQLite.

  • V tomto bode databáza ešte neexistuje. Bude však potrebná pri práci s node-sqlite3.

Ďalej pridajte nasledujúce riadky na nadviazanie spojenia s databázou SQLite:

Tu,

  • Metóda connectoToDatabase() nadviaže pripojenie k databáze.

  • V rámci connectToDatabase(), voláme metódu existsSync() z modulu fs vo vnútri príkazu if. Príkaz if kontroluje existenciu databázy v zadanom umiestnení.

    • Ak je vyhodnotenie podmienky true, potom sa Database() trieda z node-sqlite3 modulu inicializuje. Po nadviazaní pripojenia funkcia vráti objekt a skončí.

    • Ak je vyhodnotenie podmienky false (databáza neexistuje), potom vykonávanie prejde do bloku else. Tam sa Database() trieda inicializuje s dvoma argumentmi: cestou k súboru databázy a spätným volaním (callback).

V zásade sa databáza vytvorí, ak neexistuje. Ak sa však počas procesu vytvárania vyskytne akákoľvek chyba, nastaví sa objekt error a vypíše sa chybové hlásenie.

Ďalej si predstavíme kód na vytvorenie tabuľky, ak databáza neexistuje:

Tu,

  • Funkcia connectToDatabase() volá funkciu createTable(), ktorá ako argument prijíma objekt uložený v db ako argument.

  • Mimo connectToDatabase(), sme definovali metódu createTable(), ktorá ako parameter prijíma objekt pripojenia db ako parameter.

  • Metóda exec() na objekte db prijíma SQL príkaz ako argument. V rámci tohto SQL príkazu sme definovali vytvorenie tabuľky migration so 7 stĺpcami, pričom každý stĺpec zodpovedá hlavičkám stĺpcov v súbore migration_data.csv .

  • Na záver voláme funkciu connectToDatabase() metódu a exportovanie objektu pripojenia, ktorý vracia, aby sme ho mohli použiť v iných súboroch.

Uložte súbor a zatvorte editor.

Ďalej vytvoríme ďalší program na vloženie analyzovaných dát do databázy:

Zadajte nasledujúci kód do insert_data.js:

Tu,

  • Ukladáme objekt pripojenia získaný z csv-to-sqlite3.js v premennej db.

  • Vo vnútri spätného volania udalosti data (pripojeného k streamu modulu fs) voláme serialize() metódu na objekte pripojenia. Zaisťuje, že jeden SQL príkaz dokončí vykonávanie pred spustením ďalšieho, čím sa predchádza súbehom v databáze (systém spúšťajúci konkurenčné operácie súčasne).

  • Metóda serialize() prijíma tri argumenty:

    • Prvým argumentom je SQL príkaz.

    • Druhým argumentom je pole.

    • Tretím argumentom je spätné volanie, ktoré sa spustí, keď sa dáta úspešne alebo neúspešne vložia do databázy.

Sme pripravení spustiť program. Spustite insert_data.js pomocou Node.js:

V závislosti od výkonu systému môže proces chvíľu trvať. Po dokončení by však výstup mal vyzerať približne takto:

Krok 5 – Zápis dát do CSV

Po predchádzajúcej časti máme databázu obsahujúcu všetky záznamy, ktoré sme analyzovali z migration_data.csv. V tejto časti budeme čítať dáta z databázy a zapisovať ich do samostatného súboru CSV.

Vytvorte nový JavaScript súbor na uloženie programu:

Najprv pridajte nasledujúce riadky na importovanie fs a csv-stringify  spolu s objektom databázového pripojenia z csv-to-sqlite3.js:

Ďalej pridáme premennú, ktorá obsahuje názov CSV súboru, do ktorého sa má zapisovať, spolu so zapisovateľným streamom:

Tu,

  • Metóda createWriteStream() prijíma ako argument názov súboru, do ktorého sa má zapisovať. Súbor pomenujeme saved_from_db.csv.

  • Premenná column uchováva pole, ktoré obsahuje všetky názvy hlavičiek pre CSV dáta.

Ďalej pridajte nasledujúce riadky kódu na čítanie dát z databázy a ich zápis do saved_from_db.csv:

Tu,

  • Voláme metódu stringify() s objektom ako argumentom. Výsledkom je transformačný stream, ktorý prevádza dáta z objektu do formátu CSV. Objekt odovzdaný metóde stringify() má dve vlastnosti:

    • header: Prijíma boolovskú hodnotu. Ak je hodnota true, vygeneruje sa hlavička.

    • columns: Prijíma pole, ktoré obsahuje názvy stĺpcov, ktoré sa majú zapísať do prvého riadku CSV súboru, ak header je true.

  • Metóda each() z objektu pripojenia csv-to-sqlite3 sa volá s dvoma argumentmi: SQL príkazom (čítanie dát z databázy) a callbackom (spracovanie úspechu/chyby).

  • Pri každej iterácii each(), pipe() (zo streamu stringifier) začne posielať dáta po častiach do zapisovateľného streamu writableStream. Každá časť dát sa potom zapíše do saved_from_db.csv.

  • Po zapísaní všetkých dát do CSV súboru sa na obrazovke konzoly zobrazí správa o úspechu.

Finálny kód by mal vyzerať takto:

Uložte súbor a zatvorte editor. Teraz môžeme program spustiť pomocou Node.js:

Ak chcete overiť, či boli dáta úspešne exportované, skontrolujte obsah saved_from_db.csv:

Záverečné myšlienky

V tomto návode sme si ukázali prácu so súbormi CSV v Node.js pomocou modulov node-csv a node-sqlite3. Vytvorili sme niekoľko programov na dosiahnutie rôznych úloh, napríklad parsovanie dát z CSV, vloženie dát do databázy SQLite a zápis dát do nového súboru CSV.

Tento návod ukazuje iba malú časť možností node-csv modulu. Viac o všetkých jeho funkciách sa dozviete na CSV Project. Ak sa chcete dozvedieť viac o node-sqlite3, pozrite si oficiálnu dokumentáciu na GitHube. Ďalším modulom, ktorý stojí za zmienku, je event-stream na zjednodušenie práce so streamami.

Máte záujem o ďalší rozvoj svojho projektu v Node.js? Tu je niekoľko návodov pre Node.js, ktoré by ste si mali pozrieť:

Príjemné programovanie!

author

Preslav Dobrev

Autor · CloudSigma

Preslav Dobrev je kreatívny dizajnér v spoločnosti CloudSigma, ktorý sa zameriava na konzistentnú firemnú identitu prostredníctvom tradičných a inovatívnych marketingových kanálov. Dokáže brilantne spájať umeleckú víziu so strategickým marketingom, čím vytvára pôsobivé príbehy značky.

Komentáre

Zatiaľ žiadne komentáre. Buďte prvý.