Перейти к основному содержимому
Модуль 8 · Урок 2 из 430/32 в курсе~15 min
Уроки модуля (2/4)

Задача: парсер CSV

Формат CSV (значения, разделенные запятыми) используется повсюду: экспорт из Excel, дампы баз данных, вывод из инструментов командной строки. Разбор — это небольшая задача, сочетающая в себе split, map, деструктуризация и конструкция объектов.

Формат

Минимальный CSV-файл представляет собой многострочную строку: первая строка – это заголовок (имена столбцов), затем одна строка. строка для каждой записи с полями, разделенными запятыми.

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

Классическая цель — превратить его в массив объектов:

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

Рецепт в 3 шага

  1. Разбить строку по строкам: csv.split('\n')
  2. Извлеките строку заголовка: первую строку, разделенную запятой.
  3. Сопоставьте каждую оставшуюся строку с объектом, соединив каждое поле с соответствующим заголовком.
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;
  });
}

Более современные альтернативы:

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

Преобразование типов

Анализируемые поля всегда представляют собой строки. Если вы знаете, что некоторые столбцы являются числами:

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

Или напишите небольшую «схему»:

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

Попробуйте это

Упражнение#js.m8.l2.e1
Попыток: 0Загрузка…

Определите `parseCSV(csv)`, который принимает строку CSV (первая строка = заголовок, запятые в качестве разделителя). Верните массив объектов с ключами заголовка. Все значения остаются строками. Игнорировать пустые строки.

Загрузка редактора…
Показать подсказку

разделить на новую строку, первая строка = заголовок, сопоставить остальные, Object.fromEntries.

Решение доступно после 3 попыток

Обзор упражнения

Упражнение#js.m8.l2.e2
Попыток: 0Загрузка…

Определите `columnMean(csv, columnsName)`, который анализирует CSV, преобразует значения столбца в числа и возвращает их среднее значение (число). Если строк данных нет, верните 0.

Загрузка редактора…
Показать подсказку

Найдите индекс столбца, сопоставьте строки → Число, приведите к сумме, разделите на длину.

Решение доступно после 3 попыток