Реализация функции разбора CSV‑данных

CSV нельзя в общем случае разобрать split по запятым: поля могут содержать кавычки, запятые и переводы строк. Для данного простого примера достаточно разделения строк и полей с явным ограничением формата.

Короткий ответ

Что ответить на собеседовании

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-парсер.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее