Direkt zum Hauptinhalt springen
eLearner.app
Modul 8 · Lektion 2 von 430/32 im Kurs~15 min
Lektionen des Moduls (2/4)

Herausforderung: CSV-Parser

Das CSV-Format (Comma-Separated Values) ist überall: Exports aus Excel, Datenbank-Dumps, Ausgaben von Kommandozeilenwerkzeugen. Das Parsen ist eine kleine Herausforderung, die split, map, Destructuring und das Aufbauen von Objekten kombiniert.

Das Format

Ein minimales CSV ist eine mehrzeilige Zeichenkette: Die erste Zeile ist der Header (Spaltennamen), gefolgt von einer Zeile pro Datensatz, deren Felder durch Kommata getrennt sind.

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

Das klassische Ziel besteht darin, dies in ein Array von Objekten umzuwandeln:

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

Das Rezept in 3 Schritten

  1. Teile die Zeichenkette in Zeilen auf: csv.split('\n')
  2. Extrahiere die Header-Zeile: die erste Zeile, getrennt durch Kommata
  3. Mappe jede verbleibende Zeile in ein Objekt, wobei jedes Feld dem entsprechenden Header zugeordnet wird
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;
  });
}

Moderne Alternativen:

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

Typen konvertieren

Die geparsten Felder sind immer Strings. Wenn du weißt, dass bestimmte Spalten Zahlen enthalten:

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

Oder du schreibst ein kleines „Schema“:

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

Probier es aus

Übung#js.m8.l2.e1
Versuche: 0Wird geladen…

Definiere `parseCSV(csv)`: Erhält eine CSV-Zeichenkette (erste Zeile = Header, Komma als Trennzeichen). Gibt ein Array von Objekten mit den Schlüsseln aus dem Header zurück. Alle Werte bleiben Strings. Ignoriere leere Zeilen.

Editor wird geladen…
Hinweis anzeigen

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

Lösung nach 3 Versuchen verfügbar

Wiederholungsübung

Übung#js.m8.l2.e2
Versuche: 0Wird geladen…

Definiere `columnMean(csv, columnName)`: Parst das CSV, konvertiert die Werte der Spalte in Zahlen und gibt deren Durchschnitt (Zahl) zurück. Wenn keine Datenzeilen vorhanden sind, gib 0 zurück.

Editor wird geladen…
Hinweis anzeigen

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

Lösung nach 3 Versuchen verfügbar