Vissza a bloghoz

CSV kezelése Node.js-ben a Node-CSV használatával

CSV kezelése Node.js-ben a Node-CSV használatával

Egy CSV fájl egy egyszerű szöveges fájl, amely táblázatos formátumban tárolja az adatokat. A legtöbb esetben a CSV-fájlok vesszőt (,) használnak határolóként, innen ered a CSV (Comma Separated Values - vesszővel elválasztott értékek) név. Olyan helyzetekben használják, amikor az adatkompatibilitás fontos szempont, mivel a CSV-fájlok bármilyen szövegszerkesztővel, táblázatkezelő alkalmazással és egyéb speciális eszközökkel megnyithatók. Valójában számos programozási nyelv kínál beépített támogatást a CSV-hez.

Ebben az útmutatóban megtanuljuk a CSV használatát egy minta Node.js alkalmazásban.

CSV a Node.js-ben

A Node.js egy nyílt forráskódú és platformfüggetlen JavaScript futtatókörnyezet. Az egyik legnépszerűbb háttérrendszerré (backend) vált, amely számos webszolgáltatást működtet az interneten. Még az olyan nagyvállalatok is, mint a Netflix és az Uber, a Node.js-t használják szolgáltatásaik működtetésére.

A Node.js számos olyan modullal is rendelkezik, amelyek telepíthetők a projektek extra funkciókkal való bővítésére. Ha a CSV-ről van szó, számos modul áll rendelkezésre, például a node-csv, fast-csv, és papaparse stb.

Ahogy az útmutató címe is sugallja, a node-csv modult fogjuk használni a CSV-fájlok olvasására Node.js streamek segítségével. Bemutatjuk az elemzett adatokkal való munkát is, például az adatok átvitelét egy SQLite adatbázisba.

Előfeltételek

1. lépés – A szükséges szoftverek telepítése

Ehhez az útmutatóhoz egy Ubuntu 22.04 LTS-t futtató, könnyűsúlyú szervert hoztam létre (SSH-n keresztül csatlakozva):

Most telepíteni fogjuk rá a Node.js-t és az SQLite-ot.

  • A Node.js LTS telepítése

A Node.js közvetlenül elérhető a hivatalos Ubuntu csomagtárolókból. Ez azonban nem a legfrissebb verzió. Ezért egy harmadik féltől származó tárolóra (Nodesource) fogunk támaszkodni a legújabb Node.js csomagok beszerzéséhez.

Adja hozzá a Node.js LTS tárolóját:

Most telepítse a Node.js LTS-t:

  • Az SQLite telepítése

Az SQLite-ot közvetlenül az Ubuntu csomagtárolókból fogjuk telepíteni. Futtassa a következő parancsokat:

2. lépés – A projektkönyvtár beállítása

Ebben a szakaszban egy külön könyvtárat készítünk elő a projektünk számára. Ez fogja tárolni az összes projektfájlt a további modulokkal együtt.

Hozzon létre egy új könyvtárat:

Lépjen be a könyvtárba:

Ezután futtassa a következő parancsot, hogy a könyvtárat npm projektként deklarálja:

Miután a projektmappa inicializálása megtörtént, elkezdhetjük a szükséges csomagok és modulok telepítését. Először a node-csv:

A node-csv modul valójában több más modul gyűjteménye: csv-generate, csv-parse (CSV-fájlok elemzése), csv-stringify (adatok írása CSV-be), és stream-transform.

Ezután szükségünk van az SQLite-tal való kommunikációhoz szükséges modulra. A következő parancs telepíti a node-sqlite3 modult:

A projektünkhöz szükséges összetevő egy CSV-fájl. Bemutató céljából az új-zélandi migrációs CSV-fájlt fogjuk használni:

Vessünk egy gyors pillantást a fájl tartalmára:

Itt,

  • Az első sor az oszlopneveket írja le.

  • A következő sorok tartalmazzák ezen mezők értékeit.

  • Minden sort egy új sor (\n) választ el.

  • Minden adatpontot egy vessző (,) választ el.

A CSV azonban nem korlátozódik a vesszők határolóként való használatára. Egyéb gyakori határolók közé tartoznak a kettőspontok (:), a pontosvesszők (;) és a tabulátorok (\td).

3. lépés – CSV olvasása

Ebben a szakaszban bemutatjuk egy olyan mintaprogram megvalósítását, amely adatokat olvas be és elemez a CSV-fájlból.

Hozzon létre egy új JavaScript fájlt:

Nyissa meg a fájlt a kedvenc szövegszerkesztőjében:

Először importálni fogjuk a fs és csv-parse modulokat:

Itt,

  • Először az fs változóhoz hozzárendeljük az fs objektumot, amelyet a Node.js require() metódus ad vissza a modul importálásakor.

  • Ezután a parse metódust kinyerjük a require() metódus által visszaadott objektumból a parse változóba a destrukturáló szintaxis.

Ezután hozzáadjuk a kódokat a CSV-fájl beolvasásához:

Itt,

  • Meghívjuk a createReadStream() metódust az fs modulból, és argumentumként átadjuk az olvasni kívánt CSV-fájlt. Ezután létrehoz egy olvasható streamet a nagyobb fájl kisebb darabokra bontásával.

  • A stream létrehozása után a pipe() metódus továbbítja a stream adatok darabjait egy másik streamnek. Ez az új stream a parse() metódus meghívásakor jön létre a csv-modulból.

  • A csv-modul egy olvasható/írható transzformációs streamet alkalmaz, amely fogad egy adatdarabot, és átalakítja azt egy másik formátumba.

  • A parse() metódus tulajdonságokkal rendelkező objektumokat fogad el. Az objektum tovább feldolgozza az elemzett adatokat. Itt az objektum a következő tulajdonságokat veszi fel:

    • delimiter: Az értékek elválasztására szolgáló határoló karakter. A cél CSV-nk esetében ez a vessző (,).

    • from_line: Az a sorszám, ahonnan az elemző elkezdi az elemzést. A megadott 2-es értékkel az elemző kihagyja az 1. sort, és a 2. sornál kezd. Ezzel az elrendezéssel elkerüljük, hogy az oszlopnevek bekerüljenek az elemzett adatok közé.

Ezután csatolni fogunk egy streaming eseményt a Node.js on() metódusával:

Itt,

  • Egy bizonyos esemény kiváltásakor a streaming esemény lehetővé teszi egy metódus számára, hogy feldolgozzon egy adatdarabot.

  • Amikor a parse() metódus által elemzett adatok készen állnak a felhasználásra, az kiváltja a data eseményt.

  • Az adatok eléréséhez egy visszahívást (callback) adunk át az on() metódusnak, amely egy row paramétert vesz fel.

  • A row paraméter egy adatdarab tömb formájában (az elemzés eredménye).

  • Végül az adatok naplózásra kerülnek a konzolon a console.log().

A program befejezéséhez további stream eseményeket adunk hozzá a hibák kezelésére, és egy sikeres üzenet kiírására, amikor a CSV-fájl összes adata elfogyott. Frissítse a kódot az alábbiak szerint:

Itt,

  • Az end esemény akkor váltódik ki, amikor a CSV-fájlban lévő összes adat feldolgozásra került. Ez a következő metódus meghívását eredményezi: console.log() metódus, amely kiír egy sikeres üzenetet.

  • Az error esemény akkor váltódik ki, ha hiba lép fel a CSV-adatok elemzése során. Ez a következő metódus meghívását eredményezi: console.log() metódus, amely kiír egy hibaüzenetet.

A végleges kódnak így kell kinéznie:

Mentse a fájlt, és zárja be a szerkesztőt. Most már készen állunk a program végrehajtására. Futtassa a Node.js használatával:

A kimenetnek valahogy így kell kinéznie:

Vegye figyelembe, hogy az adatok feldolgozása, átalakítása és konzolra történő kiírása megtörténik. Mivel ez egy folyamatos folyamat, úgy fog tűnni, mintha az adatok letöltése zajlana, ahelyett, hogy a kimenet egyszerre jelenne meg.

4. lépés – CSV-adatok átvitele adatbázisba

Eddig megtanultuk, hogyan kell elemezni egy CSV-fájlt a node-csv használatával. Ez a szakasz bemutatja az elemzett adatok átvitelét egy adatbázisba (SQLite).

Hozzon létre egy új JavaScript-fájlt az adatbázissal való interakcióhoz:

Most nyissa meg a fájlt egy szövegszerkesztőben:

A programunkat a következő kódokkal indítjuk:

Itt,

  • Az első sorban importáljuk a fs modult.

  • A harmadik sorban a filepath változó tartalmazza az SQLite adatbázis elérési útját.

  • Ezen a ponton az adatbázis még nem létezik. Azonban szükség lesz rá, amikor a node-sqlite3.

Ezután adja hozzá a következő sorokat az SQLite adatbázishoz való kapcsolat létrehozásához:

Itt,

  • A connectoToDatabase() metódus kapcsolatot létesít az adatbázissal.

  • A connectToDatabase() függvényen belül meghívjuk a existsSync() metódust az fs modulból egy if utasításon belül. Az if utasítás ellenőrzi az adatbázis létezését a megadott helyen.

    • Ha a feltétel kiértékelése true, akkor a Database() osztály a node-sqlite3 modulból példányosításra kerül. Miután a kapcsolat létrejött, a függvény egy objektumot ad vissza és kilép.

    • Ha a feltétel kiértékelése false (az adatbázis nem létezik), akkor a végrehajtás az else blokkra ugrik. Ott a Database() osztály két argumentummal inicializálódik: az adatbázisfájl elérési útjával és egy callback függvénnyel.

Alapvetően az adatbázis létrejön, ha még nem létezik. Ha azonban a létrehozási folyamat során bármilyen hiba lép fel, beállítja a error objektumot, és kiírja a hibaüzenetet.

Ezután bemutatjuk a kódokat egy tábla létrehozásához, ha az adatbázis nem létezik:

Itt,

  • A connectToDatabase() meghívja a createTable() függvényet, amely argumentumként fogadja a db változóban tárolt objektumot.

  • A connectToDatabase() kívül definiáltuk a createTable() metódust, amely paraméterként fogadja a db kapcsolat objektumot.

  • A exec() metódus a db objektumon egy SQL utasítást vár argumentumként. Ezen az SQL utasításon belül definiáltuk a migration tábla létrehozását 7 oszloppal, ahol minden oszlop megfelel a migration_data.csv fájl oszlopfejléceinek.

  • Végül meghívjuk a connectToDatabase() metódust, és exportáljuk az általa visszaadott kapcsolat objektumot, hogy más fájlokban is használhassuk.

Mentse el a fájlt, és zárja be a szerkesztőt.

Ezután egy másik programot fogunk létrehozni az elemzett adatok adatbázisba történő beillesztésére:

Írja be a következő kódot a insert_data.js:

Itt,

  • A kapcsolat objektumot, amelyet innen kaptunk: csv-to-sqlite3.js, a következő változóban tároljuk: db.

  • A (fs modul streamhez csatolt) data esemény callback-en belül meghívjuk a serialize() metódust a kapcsolat objektumon. Ez biztosítja, hogy az egyik SQL utasítás végrehajtása befejeződjön, mielőtt a következő elkezdődne, megakadályozva az adatbázis versenyhelyzeteit (amikor a rendszer egyszerre futtat egymással versengő műveleteket).

  • A serialize() három argumentumot fogad el:

    • Az első argumentum az SQL utasítás.

    • A második argumentum egy tömb.

    • A harmadik argumentum egy callback, amely akkor fut le, amikor az adatok sikeresen vagy sikertelenül beillesztésre kerülnek az adatbázisba.

Készen állunk a program futtatására. Futtassa a insert_data.js fájlt a Node.js használatával:

A rendszer teljesítményétől függően a folyamat befejezése eltarthat egy ideig. A befejezés után azonban a kimenetnek valahogy így kell kinéznie:

5. lépés – Adatok írása CSV-be

Az előző szakasz után van egy adatbázisunk, amely tartalmazza az összes olyan rekordot, amelyet a migration_data.csv. Ebben a szakaszban be fogjuk olvasni az adatokat az adatbázisból, és egy külön CSV-fájlba fogjuk írni őket.

Hozzon létre egy új JavaScript-fájlt a program tárolásához:

Először adja hozzá a következő sorokat az fs és a csv-stringify  importálásához, valamint az adatbázis-kapcsolati objektum importálásához innen: csv-to-sqlite3.js:

Ezután hozzáadunk egy változót, amely a kiírandó CSV-fájl nevét tartalmazza, valamint egy írható streamet:

Itt,

  • A createWriteStream() metódus argumentumként fogadja a kiírandó fájlnevet. A fájlt a következőképpen fogjuk elnevezni: saved_from_db.csv.

  • A column változó egy olyan tömböt tárol, amely a CSV-adatok fejlécének összes nevét tartalmazza.

Ezután adja hozzá a következő kódsorokat, hogy beolvassa az adatokat az adatbázisból, és beírja azokat a saved_from_db.csv-be::

Itt,

  • Meghívjuk a stringify() metódust egy objektummal mint argumentummal. Ez egy olyan transzformációs streamet eredményez, amely az adatokat objektumból CSV formátumba konvertálja. A stringify() metódusnak átadott objektumnak két tulajdonsága van:

    • header: Logikai (Boolean) értéket fogad el. Ha az érték true, akkor létrejön egy fejléc.

    • columns: Egy olyan tömböt fogad el, amely a CSV-fájl első sorába írandó oszlopneveket tartalmazza, ha a header értéke true.

  • A each() metódus a csv-to-sqlite3 kapcsolati objektumból két argumentummal lesz meghívva: az SQL utasítással (adatok beolvasása az adatbázisból) és egy visszahívási függvénnyel (callback, amely a sikert/hibát kezeli).

  • A(z) each(), minden egyes iterációjakor a pipe() (a stringifier streamből) elkezdi az adatokat darabokban küldeni a writableStream írható streambe. Ezután minden egyes adatdarab beíródik a saved_from_db.csv fájlba..

  • Amikor az összes adat beíródott a CSV-fájlba, egy sikeres befejezést jelző üzenet jelenik meg a konzolon.

A végleges kódnak így kell kinéznie:

Mentse el a fájlt, és zárja be a szerkesztőt. Most már futtathatjuk a programot a Node.js használatával:

Annak ellenőrzéséhez, hogy az adatok exportálása sikeres volt-e, ellenőrizze a következő fájl tartalmát: saved_from_db.csv:

Záró gondolatok

Ebben az útmutatóban bemutattuk a CSV-fájlok kezelését Node.js-ben a node-csv és a node-sqlite3 modulok használatával. Több programot is létrehoztunk különböző feladatok elvégzésére, például adatok elemzésére CSV-ből, adatok feltöltésére egy SQLite adatbázisba, valamint adatok írására egy új CSV-fájlba.

Ez az útmutató csak egy kis részét mutatja be a node-csv modul képességeinek. Tudjon meg többet az összes funkciójáról itt: CSV Project. Ha többet szeretne megtudni a node-sqlite3-ról, tekintse meg a hivatalos dokumentációt a GitHubon. Egy másik említésre méltó modul az event-stream a streamekkel való munka egyszerűsítésére.

Szeretné továbbfejleszteni Node.js projektjét? Íme néhány Node.js oktatóanyag, amelyet érdemes megnéznie:

Kellemes kódolást!

author

Preslav Dobrev

Szerző · CloudSigma

Preslav Dobrev a CloudSigma kreatív tervezője, aki hagyományos és innovatív marketingcsatornák segítségével következetes vállalati identitás kialakítására összpontosít. Kiemelkedően képes ötvözni a művészi látásmódot a stratégiai marketinggel, hogy hatásos márkatörténeteket hozzon létre.

Hozzászólások

Még nincsenek hozzászólások. Legyen Ön az első.