Уроки модуля (2/4)
Задача: парсер CSV
Формат CSV (значения, разделенные запятыми) используется повсюду: экспорт из Excel, дампы баз данных, вывод из инструментов командной строки. Разбор — это небольшая задача, сочетающая в себе split, map, деструктуризация и конструкция объектов.
Формат
Минимальный CSV-файл представляет собой многострочную строку: первая строка – это заголовок (имена столбцов), затем одна строка. строка для каждой записи с полями, разделенными запятыми.
nome,eta,citta
Alice,30,Roma
Bob,25,Milano
Классическая цель — превратить его в массив объектов:
[
{ nome: 'Alice', eta: '30', citta: 'Roma' },
{ nome: 'Bob', eta: '25', citta: 'Milano' },
];Рецепт в 3 шага
- Разбить строку по строкам:
csv.split('\n') - Извлеките строку заголовка: первую строку, разделенную запятой.
- Сопоставьте каждую оставшуюся строку с объектом, соединив каждое поле с соответствующим заголовком.
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;
});
}Более современные альтернативы:
const record = Object.fromEntries(intestazione.map((nome, i) => [nome, campi[i]]));Преобразование типов
Анализируемые поля всегда представляют собой строки. Если вы знаете, что некоторые столбцы являются числами:
record.eta = Number(record.eta);Или напишите небольшую «схему»:
const numeriche = new Set(['eta', 'prezzo']);
intestazione.forEach((nome, i) => {
const v = campi[i];
record[nome] = numeriche.has(nome) ? Number(v) : v;
});Попробуйте это
Определите `parseCSV(csv)`, который принимает строку CSV (первая строка = заголовок, запятые в качестве разделителя). Верните массив объектов с ключами заголовка. Все значения остаются строками. Игнорировать пустые строки.
Показать подсказку
разделить на новую строку, первая строка = заголовок, сопоставить остальные, Object.fromEntries.
Решение доступно после 3 попыток
Обзор упражнения
Определите `columnMean(csv, columnsName)`, который анализирует CSV, преобразует значения столбца в числа и возвращает их среднее значение (число). Если строк данных нет, верните 0.
Показать подсказку
Найдите индекс столбца, сопоставьте строки → Число, приведите к сумме, разделите на длину.
Решение доступно после 3 попыток