JavaScript – stringhe e numeri – 2

Continuo da qui e finisco il rapido esame di Node.js con la valutazione se sia possibile usarlo per scripts veloci in alternativa a Python. Do subito la soluzione: sì se lo scripter è un ninjia per JavaScript o se lo script deve finire (modificato) anche nel Web. I miei validi  collaboratori  grokers Edo e PLG fanno notare che è prassi comune modificare gli script in ogni nuova istanza, a volte per pigrizia (es. nomi di files codificati nel codice), a volte per motivi più sensati (es. formattazione dell’output). Aspetta, non è una novità nuova: πάντα ῥεῖ.

Oltre a quanto raccontato nel post precedente (qui) restano (per le mie elaborazioni tipiche) da esaminare l’acquisizione di dati provenienti da fogli di calcolo tipo Excel, di solito il modulo Calc di Libre Office.

Node ha un modulo per gestire i file .xls e .xlsx:

# [SheetJS js-xlsx](http://sheetjs.com)

Parser and writer for various spreadsheet formats. Pure-JS cleanroom implementation from official specifications, related documents, and test files.
Emphasis on parsing and writing robustness, cross-format feature compatibility with a unified JS representation, and ES3/ES5 browser compatibility back to IE6.

Il modulo è installabile con npm ma da noi non viene usato. È la stessa situazione già vista con il modulo xlrd di Python.

C’è, rispetto a quanto visto nel post indicato, solo un problema legato alla rappresentazione dei numeri floating point, in particolare i separatori decimale e delle migliaia. Quest’ultimo è in genere usato solo dai gestionali, na se del caso…

Il file di dati che uso come esempio contiene questi dati:

Come già visto in precedenza acquisisto il testo dal file salvato come .csv

* xls $ node
> var fs = require('fs')
undefined
> var dati = fs.readFileSync('prova.csv', 'utf8').split('\n')
undefined
> dati
[ 'test di lettura files excel-like,,,',
  '1,"2,3",quattro,5^6',
  '2,"3,4",,dopo campo vuoto',
  '' ]

OOPS! sbagliato: la virgola iene usata sia come separatore di campo che separatore decimale. Nella creazione del .csv occorre definire il separatore di campo a punto-virgola

e sarà tutto OK

> var dati = fs.readFileSync('prova-pv.csv', 'utf8').split('\n')
undefined
> dati
[ 'test di lettura files excel-like;;;',
  '1;2,3;quattro;5^6',
  '' ]

Adesso è giunto il momento di usare le regexs, ne basta una per riga, replace non funzione su più linee:

> var ok1 = dati[1].replace(/,/g, '.')
undefined
> ok1
'1;2.3;quattro;5^6'

JavaScript (quindi Node) è –come dire– poco rigoroso sul tipo di dato che sta elaborando. Per fortuna esiste la funzione typeof, una manna da usare tutte le volte che possono esserci ambiguità:

> i = 6 * 7
42
> r = 22 / 7
3.142857142857143
> st = 'ciao!'
'ciao!'
> ov = 1 / 0
Infinity
> e = Number('x')
NaN
> typeof(i)
'number'
> typeof(r)
'number'
> typeof(st)
'string'
> typeof(ov)
'number'
> typeof(e)
'number'

va quasi bene, non distingue gli errori; ma non disperare, ci sono isNan e isFinite:

> n = Number('x')
NaN
> isNaN(n)
true
> isNaN(42)
false
> i = 1 / 0
Infinity
> isFinite(i)
false
> isFinite(42)
true

OK 🤩 JavaScript (e Node) ha quel che mi serve; solo che è diverso da Python (e da tutti gli altri linguaggi di programmazione), dipende dal programmatore, un po come parlare olandese o, ancora più panicoso, finlandese; poi ci sarebbero il coreano e il vietnamese (ma ci sono bambini di due anni che li parlano); questioni d’ambiente. Come JavaScript.

Posta un commento o usa questo indirizzo per il trackback.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: