Passer au contenu principal
eLearner.app
Module 8 · Leçon 2 sur 430/32 dans le cours~15 min
Leçons du module (2/4)

Défi : analyseur CSV

Le format CSV (Comma-Separated Values) est partout : exports Excel, dumps de bases de données, sorties d'outils en ligne de commande. Le parser est un petit défi qui combine split, map, destructuring et construction d'objets.

Le format

Un CSV minimal est une chaîne multiligne : la première ligne est l'en-tête (noms des colonnes), puis une ligne par enregistrement avec les champs séparés par des virgules.

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

L'objectif classique est de le transformer en un tableau d'objets :

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

La recette en 3 étapes

  1. Séparez la chaîne par lignes : csv.split('\n')
  2. Extrayez la ligne d'en-tête : la première ligne, découpée par les virgules
  3. Mappez chaque ligne restante dans un objet, en associant chaque champ à l'en-tête correspondant
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;
  });
}

Alternatives plus modernes :

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

Convertir les types

Les champs analysés sont toujours des chaînes de caractères. Si vous savez que certaines colonnes contiennent des nombres :

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

Ou vous pouvez écrire un petit « schéma » :

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

À vous de jouer

Exercice#js.m8.l2.e1
Tentatives : 0Chargement…

Définissez `parseCSV(csv)` qui reçoit une chaîne CSV (première ligne = en-tête, virgules comme séparateur). Retourne un tableau d'objets avec les clés de l'en-tête. Toutes les valeurs restent des chaînes de caractères. Ignorez les lignes vides.

Chargement de l'éditeur…
Afficher l'indice

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

Solution disponible après 3 tentatives

Exercice de révision

Exercice#js.m8.l2.e2
Tentatives : 0Chargement…

Définissez `columnMean(csv, columnName)` qui parse the CSV, convertit les valeurs de la colonne en nombres et retourne leur moyenne (nombre). S'il n'y a pas de lignes de données, retourne 0.

Chargement de l'éditeur…
Afficher l'indice

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

Solution disponible après 3 tentatives