Работа с CSV в JavaScript (Node.js): библиотеки, парсинг и генерация данных

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с CSV в JavaScript (Node.js): полное руководство

CSV (Comma-Separated Values) — один из самых популярных форматов для обмена табличными данными. В экосистеме Node.js существует несколько мощных библиотек для парсинга, генерации и обработки CSV-файлов. В этой статье мы рассмотрим основные инструменты, их установку, примеры использования и лучшие практики.

Популярные библиотеки для работы с CSV в Node.js

В JavaScript (Node.js) для работы с CSV чаще всего используются три библиотеки:

  • csv-parser — быстрый потоковый парсер, работающий в режиме streaming
  • csv-stringify — генератор CSV из JavaScript объектов или массивов
  • fast-csv — универсальная библиотека, объединяющая парсинг и генерацию

Установка библиотек

Для установки необходимых пакетов используйте npm:

npm install csv-parser csv-stringify fast-csv

Парсинг CSV с помощью csv-parser

Библиотека csv-parser работает в потоковом режиме, что позволяет обрабатывать файлы любого размера без загрузки их в память целиком.

Пример: чтение CSV файла

const fs = require('fs');
const csv = require('csv-parser');

const results = [];

fs.createReadStream('data.csv')
  .pipe(csv())
  .on('data', (row) => {
    results.push(row);
  })
  .on('end', () => {
    console.log('CSV файл успешно обработан');
    console.log('Первая строка:', results[0]);
  });

По умолчанию csv-parser использует первую строку файла как заголовки и возвращает объекты с соответствующими ключами.

Генерация CSV с помощью csv-stringify

Библиотека csv-stringify позволяет создавать CSV-строки из массивов или объектов JavaScript.

Пример: создание CSV из объектов

const { stringify } = require('csv-stringify');
const fs = require('fs');

const data = [
  { name: 'Иван', age: 25, city: 'Москва' },
  { name: 'Мария', age: 30, city: 'Санкт-Петербург' },
  { name: 'Алексей', age: 28, city: 'Казань' }
];

const writableStream = fs.createWriteStream('output.csv');

const stringifier = stringify({
  header: true,
  columns: ['name', 'age', 'city']
});

stringifier.pipe(writableStream);
data.forEach(row => stringifier.write(row));
stringifier.end();

Универсальное решение: fast-csv

fast-csv предоставляет как парсинг, так и генерацию CSV, а также поддерживает различные форматы (TSV, пользовательские разделители).

Пример: парсинг CSV с fast-csv

const fs = require('fs');
const csv = require('@fast-csv/parse');

const rows = [];

fs.createReadStream('data.csv')
  .pipe(csv.parse({ headers: true }))
  .on('error', error => console.error(error))
  .on('data', row => rows.push(row))
  .on('end', (rowCount) => {
    console.log(`Обработано ${rowCount} строк`);
    console.log('Данные:', rows);
  });

Пример: запись CSV с fast-csv

const fs = require('fs');
const csv = require('@fast-csv/format');

const data = [
  ['Имя', 'Возраст', 'Город'],
  ['Иван', '25', 'Москва'],
  ['Мария', '30', 'Санкт-Петербург']
];

const ws = fs.createWriteStream('output.csv');
csv.write(data, { headers: true }).pipe(ws);

Работа с большими файлами и производительность

При работе с CSV-файлами размером более 100 МБ рекомендуется использовать потоковую обработку. Все три рассмотренные библиотеки поддерживают стримы.

Пример: обработка большого CSV построчно

const fs = require('fs');
const csv = require('csv-parser');

let rowCount = 0;

fs.createReadStream('large-file.csv')
  .pipe(csv())
  .on('data', (row) => {
    rowCount++;
    // Обработка каждой строки без накопления в памяти
    if (rowCount % 10000 === 0) {
      console.log(`Обработано ${rowCount} строк`);
    }
  })
  .on('end', () => {
    console.log(`Всего обработано строк: ${rowCount}`);
  });

Обработка ошибок и кодировок

CSV-файлы часто содержат символы кириллицы. Важно правильно указывать кодировку при чтении:

const fs = require('fs');
const csv = require('csv-parser');
const iconv = require('iconv-l                    

Рекомендаций