Работа с CSV в JavaScript (Node.js): библиотеки и практические примеры
CSV (Comma-Separated Values) — один из самых распространённых форматов для обмена табличными данными. В экосистеме Node.js существует несколько зрелых библиотек, которые позволяют эффективно читать, обрабатывать и создавать CSV-файлы. В этой статье мы рассмотрим основные инструменты, их возможности и приведём практические примеры кода.
Популярные библиотеки для работы с CSV
1. csv-parser — быстрый потоковый парсер
Эта библиотека является стандартом для чтения CSV в Node.js. Она работает в режиме потока (stream), что позволяет обрабатывать файлы любого размера без загрузки их целиком в память.
Установка:
npm install 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.slice(0, 3)); // Первые 3 записи
});
Ключевые особенности:
- Поддержка пользовательских разделителей (по умолчанию запятая)
- Автоматическое определение заголовков из первой строки
- Возможность пропускать пустые строки
- Низкое потребление памяти благодаря потоковой обработке
2. csv-stringify — создание CSV из объектов
Этот инструмент является частью семейства csv и предназначен для генерации CSV-строк или потоков из JavaScript-объектов.
Установка:
npm install csv-stringify
Пример записи данных в CSV:
const { stringify } = require('csv-stringify');
const fs = require('fs');
const data = [
{ name: 'Анна', age: 28, city: 'Москва' },
{ name: 'Иван', age: 35, city: 'Санкт-Петербург' },
{ name: 'Ольга', age: 22, city: 'Казань' }
];
const writableStream = fs.createWriteStream('output.csv');
const stringifier = stringify({ header: true });
stringifier.pipe(writableStream);
data.forEach(row => stringifier.write(row));
stringifier.end();
console.log('Файл output.csv создан');
Возможности:
- Автоматическая экранировка специальных символов (кавычки, запятые)
- Настройка разделителя колонок
- Поддержка пользовательских заголовков
- Работа в синхронном и асинхронном режимах
3. csv-writer — простой и интуитивный API
Эта библиотека предлагает более простой интерфейс для записи CSV, особенно если вы работаете с небольшими объёмами данных.
Установка:
npm install csv-writer
Пример записи:
const createCsvWriter = require('csv-writer').createObjectCsvWriter;
const csvWriter = createCsvWriter({
path: 'users.csv',
header: [
{ id: 'id', title: 'ID' },
{ id: 'name', title: 'Имя' },
{ id: 'email', title: 'Email' }
]
});
const records = [
{ id: 1, name: 'Алексей', email: 'alex@example.com' },
{ id: 2, name: 'Мария', email: 'maria@example.com' }
];
csvWriter.writeRecords(records)
.then(() => console.log('CSV файл создан'));
Продвинутые сценарии использования
Обработка больших файлов с трансформацией данных
Объединим чтение и запись в одном потоке для обработки данных на лету:
const fs = require('fs');
const csv = require('csv-parser');
const { stringify } = require('csv-stringify');
const readStream = fs.createReadStream('input.csv');
const writeStream = fs.createWriteStream('output_transformed.csv');
const stringifier = stringify({ header: true });
readStream
.pipe(csv())
.on('data', (row) => {
// Пример трансформации: добавляем поле
row.fullName = `${row.firstName} ${row.lastName}`.toUpperCase();
stringifier.write(row);
})
.on('end', () => {
stringifier.end();
stringifier.pipe(writeStream);
console.log('Трансформация завершена');
});
Работа с нестандартными разделителями
Если ваш CSV использует табуляцию или точку с запятой:
<
Также в библиотеке
Очереди задач в Java: Обзор и реализация с java.util.concurrent
Парсинг HTML в C# (.NET): библиотеки HtmlAgilityPack и AngleSharp
FastEndpoints для C# (.NET): полное руководство с примерами
JWT токены в JavaScript (Node.js): полное руководство