Przejdź do głównej treści
eLearner.app
Moduł 8 · Lekcja 2 z 430/32 w kursie~15 min
Lekcje modułu (2/4)

Wyzwanie: parser CSV

Format CSV (Comma-Separated Values) jest powszechny: eksporty z Excela, zrzuty z baz danych, dane wyjściowe narzędzi wiersza poleceń. Parsowanie go to małe wyzwanie łączące metody split, map, destructuring oraz budowanie obiektów.

Format

Minimalny plik CSV to ciąg wielolinijkowy: pierwsza linia to nagłówek (nazwy kolumn), po której następuje jedna linia na rekord z polami rozdzielonymi przecinkami.

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

Klasycznym celem jest przekształcenie go w tablicę obiektów:

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

Przepis w 3 krokach

  1. Podziel ciąg znaków na linie: csv.split('\n')
  2. Wyodrębnij linię nagłówka: pierwsza linia podzielona według przecinków
  3. Zmapuj każdą pozostałą linię na obiekt, przypisując każde pole do odpowiadającego mu nagłówka
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;
  });
}

Nowocześniejsze alternatywy:

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

Konwersja typów

Sparsowane pola są zawsze ciągami znaków. Jeśli wiesz, że niektóre kolumny to liczby:

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

Możesz też napisać prosty „schemat”:

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

Spróbuj sam

Ćwiczenie#js.m8.l2.e1
Próby: 0Ładowanie...

Zdefiniuj funkcję `parseCSV(csv)`: przyjmuje ciąg znaków w formacie CSV (pierwsza linia = nagłówek, przecinki jako separator). Zwraca tablicę obiektów z kluczami z nagłówka. Wszystkie wartości pozostają ciągami znaków. Ignoruj puste linie.

Ładowanie edytora...
Pokaż wskazówkę

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

Rozwiązanie dostępne po 3 próbach

Ćwiczenie powtórzeniowe

Ćwiczenie#js.m8.l2.e2
Próby: 0Ładowanie...

Zdefiniuj funkcję `columnMean(csv, columnName)`: parsuje plik CSV, konwertuje wartości danej kolumny na liczby i zwraca ich średnią (liczba). Jeśli nie ma linii z danymi, zwraca 0.

Ładowanie edytora...
Pokaż wskazówkę

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

Rozwiązanie dostępne po 3 próbach