Salt la conținutul principal
Modulul 8 · Lecția 2 din 430/32 în curs~15 min
Lecții din modul (2/4)

Provocare: parser CSV

Formatul CSV (valori separate prin virgulă) este peste tot: exporturi din Excel, depozite de baze de date, ieșire din instrumentele din linia de comandă. Analizarea este o mică provocare care combină diviziunea, hartă, destructurare și construcție de obiect.

Formatul

Un CSV minim este un șir cu mai multe linii: primul rând este antetul (numele coloanelor), apoi unul rând pe înregistrare cu câmpurile separate prin virgulă.

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

Scopul clasic este de a-l transforma într-o serie de obiecte:

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

Rețeta în 3 pași

  1. Divizați șirul pe linii: csv.split('\n')
  2. Extrage rândul antetului: prima linie, împărțită prin virgulă
  3. Hartă fiecare linie rămasă la un obiect, asociind fiecare câmp cu antetul potrivit
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 mai moderne:

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

Conversia tipurilor

Câmpurile analizate sunt întotdeauna șiruri. Dacă știți că unele coloane sunt numere:

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

Sau scrieți o mică „schemă”:

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

Încearcă

Exercițiu#js.m8.l2.e1
Încercări: 0Se încarcă…

Definiți `parseCSV(csv)` care preia un șir CSV (primul rând = antet, virgulă ca separator). Returnează o serie de obiecte cu tastele de antet. Toate valorile rămân ca șiruri. Ignorați rândurile goale.

Se încarcă editorul...
Afișează indiciu

împărțit pe noua linie, primul rând = antet, hartă peste restul, Object.fromEntries.

Soluție disponibilă după 3 încercări

Exercițiu de revizuire

Exercițiu#js.m8.l2.e2
Încercări: 0Se încarcă…

Definiți `columnMean(csv, columnName)` care parsează CSV-ul, convertește valorile coloanei în numere și returnează media lor (un număr). Dacă nu există rânduri de date, returnați 0.

Se încarcă editorul...
Afișează indiciu

Găsiți indexul coloanei, hărți rândurile → Număr, reduceți la sumă, împărțiți la lungime.

Soluție disponibilă după 3 încercări