Работа с 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