Vai al contenuto
eLearner.app
Modulo 8 · Lezione 2 di 430/32 nel corso~15 min
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.

Code
nome,eta,citta
Alice,30,Roma
Bob,25,Milano

L'obiettivo classico è trasformarlo in un array di oggetti:

JS
[
  { nome: 'Alice', eta: '30', citta: 'Roma' },
  { nome: 'Bob', eta: '25', citta: 'Milano' },
];

La ricetta in 3 passi

  1. Spezza la stringa per righe: csv.split('\n')
  2. Estrai la riga di intestazione: la prima riga, splittata per virgola
  3. Mappa ogni riga rimanente in un oggetto, abbinando ogni campo all'intestazione corrispondente
JS
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:

JS
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:

JS
record.eta = Number(record.eta);

Oppure scrivi un piccolo "schema":

JS
const numeriche = new Set(['eta', 'prezzo']);
intestazione.forEach((nome, i) => {
  const v = campi[i];
  record[nome] = numeriche.has(nome) ? Number(v) : v;
});

Prova tu

Esercizio#js.m8.l2.e1
Tentativi: 0Caricamento…

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.

Caricamento editor…
Mostra suggerimento

split su newline, prima riga = intestazione, map sulle altre, Object.fromEntries.

Soluzione disponibile dopo 3 tentativi

Esercizio di ripasso

Esercizio#js.m8.l2.e2
Tentativi: 0Caricamento…

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.

Caricamento editor…
Mostra suggerimento

Trova l'indice della colonna, mappa righe → Number, reduce somma, dividi per length.

Soluzione disponibile dopo 3 tentativi