Lezioni del modulo (2/4)
Sfida: parser CSV
Il formato CSV (Comma-Separated Values) è ovunque: export da Excel, dump da database, output di tool a riga di comando. Parsarlo è una piccola sfida che combina split, map, destructuring e costruzione di oggetti.
Il formato
Un CSV minimale è una stringa multilinea: prima riga intestazione (nomi colonne), poi una riga per record con i campi separati da virgola.
nome,eta,citta
Alice,30,Roma
Bob,25,Milano
L'obiettivo classico è trasformarlo in un array di oggetti:
[
{ nome: 'Alice', eta: '30', citta: 'Roma' },
{ nome: 'Bob', eta: '25', citta: 'Milano' },
];La ricetta in 3 passi
- Spezza la stringa per righe:
csv.split('\n') - Estrai la riga di intestazione: la prima riga, splittata per virgola
- Mappa ogni riga rimanente in un oggetto, abbinando ogni campo all'intestazione corrispondente
function parseCSV(csv) {
const righe = csv.split('\n');
const intestazione = righe[0].split(',');
return righe.slice(1).map((riga) => {
const campi = riga.split(',');
const record = {};
intestazione.forEach((nome, i) => {
record[nome] = campi[i];
});
return record;
});
}Alternative più moderne:
const record = Object.fromEntries(intestazione.map((nome, i) => [nome, campi[i]]));Convertire i tipi
I campi parsati sono sempre stringhe. Se sai che alcune colonne sono numeri:
record.eta = Number(record.eta);Oppure scrivi un piccolo "schema":
const numeriche = new Set(['eta', 'prezzo']);
intestazione.forEach((nome, i) => {
const v = campi[i];
record[nome] = numeriche.has(nome) ? Number(v) : v;
});Prova tu
Definisci `parseCSV(csv)` che riceve una stringa CSV (prima riga = intestazione, virgole come separatore). Ritorna un array di oggetti con le chiavi dell'intestazione. Tutti i valori restano stringhe. Ignora righe vuote.
Mostra suggerimento
split su newline, prima riga = intestazione, map sulle altre, Object.fromEntries.
Soluzione disponibile dopo 3 tentativi
Esercizio di ripasso
Definisci `columnMean(csv, columnName)` che parsa il CSV, converte i valori della colonna in numeri e ritorna la loro media (numero). Se non ci sono righe dati ritorna 0.
Mostra suggerimento
Trova l'indice della colonna, mappa righe → Number, reduce somma, dividi per length.
Soluzione disponibile dopo 3 tentativi