CSV нельзя в общем случае разобрать split по запятым: поля могут содержать кавычки, запятые и переводы строк. Для данного простого примера достаточно разделения строк и полей с явным ограничением формата.
Реализация функции разбора CSV‑данных
CSV нельзя в общем случае разобрать split по запятым: поля могут содержать кавычки, запятые и переводы строк. Для данного простого примера достаточно разделения строк и полей с явным ограничением формата.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Создайте функцию, которая принимает текст CSV‑файла и преобразует его в массив объектов, где каждое свойство соответствует заголовку столбца. В качестве примера приведены входные строки и ожидаемый результат.
/*
Input:
id,firstName,lastName,quote
42e9f,Linus,Torvalds,Talk is cheap. Show me the code.
4f5e4,Joel,Spolsky,It’s harder to read code than to write it.
Expected output:
[
{
id: '42e9f',
firstName: 'Linus',
lastName: 'Torvalds',
quote: 'Talk is cheap. Show me the code.'
},
{
id: '4f5e4',
firstName: 'Joel',
lastName: 'Spolsky',
quote: 'It’s harder to read code than to write it.'
}
]
*/
function parse(csv) {
// ...
}
Ответ
CSV нельзя в общем случае разобрать split по запятым: поля могут содержать кавычки, запятые и переводы строк. Для данного простого примера достаточно разделения строк и полей с явным ограничением формата.
function parse(csv) {
const text = csv.replace(/^\uFEFF/, '').replace(/\r\n/g, '\n').replace(/\n$/, '');
if (!text) return [];
if (text.includes(String.fromCharCode(34))) throw new Error('Поля с кавычками требуют полноценного CSV-парсера');
const [header, ...lines] = text.split('\n');
const keys = header.split(',');
if (new Set(keys).size !== keys.length || keys.some(key => !key)) throw new Error('Некорректные заголовки');
return lines.map(line => {
const values = line.split(',');
if (values.length !== keys.length) throw new Error('Неверное число столбцов');
return Object.fromEntries(keys.map((key, i) => [key, values[i]]));
});
}
Решение покрывает приведённый ввод без кавычек и сохраняет значения строками. Для произвольного CSV нужен автомат состояний или готовый парсер: двойные кавычки экранируются удвоением, разделитель и перевод строки внутри кавычек входят в поле. Не выдавайте эту сокращённую реализацию за универсальный CSV-парсер.