Direct naar de hoofdinhoud
Module 8 · Les 2 van 430/32 in de cursus~15 min
Modulelessen (2/4)

Uitdaging: CSV-parser

Het CSV-formaat (Comma-Separated Values) is overal: exporten vanuit Excel, databasedumps, uitvoer van opdrachtregelprogramma's. Het parseren ervan is een kleine uitdaging die split, map, destructureren en objectconstructie.

Het formaat

Een minimale CSV is een tekenreeks van meerdere regels: de eerste rij is de kop (kolomnamen), daarna één rij per record met velden gescheiden door komma's.

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

Het klassieke doel is om er een reeks objecten van te maken:

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

Het 3-stappen recept

  1. Splits de tekenreeks per regels: csv.split('\n')
  2. Extraheer de koprij: de eerste regel, gesplitst door komma
  3. Wijs elke resterende regel toe aan een object, waarbij elk veld wordt gekoppeld aan de overeenkomende koptekst
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;
  });
}

Modernere alternatieven:

JS
const record = Object.fromEntries(intestazione.map((nome, i) => [nome, campi[i]]));

Typen converteren

Geparseerde velden zijn altijd tekenreeksen. Als u weet dat sommige kolommen getallen zijn:

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

Of schrijf een klein "schema":

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

Probeer het

Oefening#js.m8.l2.e1
Pogingen: 0Laden…

Definieer `parseCSV(csv)` waaraan een CSV-tekenreeks moet doorgegeven worden (eerste rij = kop, komma's als scheidingsteken). Retourneer een array met objecten met de header-toetsen. Alle waarden blijven als tekenreeksen. Negeer lege rijen.

Editor laden…
Toon hint

splitsen op nieuwe regel, eerste rij = kop, kaart over de rest, Object.fromEntries.

Oplossing beschikbaar na 3 pogingen

Oefening beoordelen

Oefening#js.m8.l2.e2
Pogingen: 0Laden…

Definieer 'columnMean(csv, columnName)' waarmee de CSV wordt geparseerd, de kolomwaarden worden geconverteerd naar getallen en het gemiddelde ervan (een getal) wordt geretourneerd. Als er geen gegevensrijen zijn, wordt 0 geretourneerd.

Editor laden…
Toon hint

Zoek de kolomindex, breng rijen in kaart → Getal, reduceer tot som, deel door lengte.

Oplossing beschikbaar na 3 pogingen