lunedì, dicembre 01, 2014

Esercitazioni su node.js: esercizio 2

Testo dell'esercizio
Scrivere un programma che utilizzi una singola operazione sincrona per leggere il contenuto di un file e stampare a video il numero di linee del file letto.
Il percorso completo del file verrà passato come primo argomento sulla linea di comando.

Suggerimenti
Per lavorare con il filesystem avremo bisogno del modulo fs di node.js, che includiamo nel programma con l'istruzione

 var mioFs = require('fs');  

A questo punto date un'occhiata alla guida ufficiale del modulo fs, in particolare alla funzione mioFs.readSync(...) 

La funzione è sincrona e ritorna un Buffer, che è il modo standard che ha node.js di rappresentare un insieme di dati, in qualsiasi formato: ascii, utf-8, binario.

Se i dati sono in un formato testuale, basterà invocare il metodo toString(...) per ottenere la stringa corrispondente.

Metodo veloce per contare le linee in una stringa

 var stringa = "Quante linee\nci sono in\nquesta stringa?";  
 var linee = stringa.split('\n');  
 console.log(linee.length);  

Una possibile soluzione
 var fs = require('fs'),  
    contenutoFile = fs.readFileSync(process.argv[2]),  
    numeroLinee = contenutoFile.toString().split('\n').length;  
   
 console.log(numeroLinee);  

In questo caso, readFileSync è una funzione sincrona, ritorna a sinistra un Buffer di dati, che deve essere convertito in stringa con il metodo toString().

Alternativamente si puo' specificare la codifica particolare con cui leggere il file ed omettere la trasformazione con il toString()
 var fs = require('fs'),  
    contenutoFile = fs.readFileSync(process.argv[2], 'utf-8'),  
    numeroLinee = contenutoFile.split('\n').length;  
   
 console.log(numeroLinee);  

Ho aggiornato su github il progetto, effettuate un git pull per aggiornare i sorgenti che avete in locale, come mostrato in questo post

Alla prox.
Ivan

3 commenti:

  1. Anonimo7:24 PM

    Certo che avere a che fare con un linguaggio non tipizzato espone a grandi rischi!
    Avevo commesso un errore tipografico (lenght invece di length) e la mia soluzione, molto più prolissa ma simile alla tua, continuava a rispondermi: undefined.

    Però in compenso ho imparato come fare il debug:
    Installare node-inspector:

    npm install -g node-inspector
    avviare il debugger:
    node-debug my_app.js
    Si apre il debugger di chrome, con tutte le variabili locali dichiarate.
    Basta evidenziare un pezzo di funzione per avere il watch immediato.
    E' così che ho capito che:
    my_buffer.toString().split('\n') restituiva un array corretto
    e che l'errore era nella proprietà finale my_buffer.toString().split('\n').lenght

    RispondiElimina
    Risposte
    1. Pregi e difetti di un linguaggio dinamico e non tipizzato :)
      Grande chicca per il debugging!
      E' incredibile quanti moduli si trovino con npm ;).

      Elimina