dicembre 29, 2020 · NodeJS

Appunti NodeJS: leggere e scrivere file di testo

Rapido post di appunti NodeJS. Mi è capitato di recente di dover scrivere un programmino in NodeJS per leggere un csv da filesystem, fare un minimo di elaborazione sui dati e scrivere il risultato su un altro file sempre su filesystem. Siccome ho speso tipo 10 minuti a documentarmi su come fare, lo lascio scritto qui così un domani non mi tocca cercare ancora :-)

Per leggere un file di testo e ottenere un array di stringhe (una per ciascuna riga) possiamo usare una funzione del genere:

import readline from 'readline';
import fs from 'fs';

async function readFile(filename) {

	const righeLette = []

	const fileStream = fs.createReadStream(filename);
	const rl = readline.createInterface({
		input: fileStream,
		crlfDelay: Infinity
	});

	for await (const line of rl) {
		righeLette.push(line);
	}

	return righeLette;
    
}

// Esempio di utilizzo:
const righe = await readFile('miopath/miofile.csv');

Si noti il parametri crlfDelay, che considera tutti i caratteri terminatori di riga (\n, \f) come una unica interruzione.

Per scrivere un array di stringhe su un file possiamo usare una funzione del genere:

import fs from 'fs';

async function writeToFile(rows, filename){

	var writer = fs.createWriteStream(filename, {})	

	rows.forEach(row => writer.write(row + "\n"));

	writer.end();

}

// Esempio di utilizzo:
await writeToFile(arrayDiRighe, 'miopath/nuovofile.csv');

Si noti che a ogni riga viene aggiunto un terminatore (\n). A seconda delle applicazioni potrebbe non essere necessario. Inoltre, in questo modo il file di destinazione viene sempre creato da zero all'apertura dello stream (se esisteva già viene azzerato). Se vogliamo andare in aggiunta, dobbiamo passare il flag "a" (append) all'apertura dello stream:

	var writer = fs.createWriteStream(filename, {
		flags: 'a'
	})