Работа с CSV в TypeScript: библиотеки, парсинг и генерация данных

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

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

Начать курс

Работа с CSV в TypeScript: полное руководство

CSV (Comma-Separated Values) — один из самых распространённых форматов для обмена табличными данными. В экосистеме TypeScript существует несколько зрелых библиотек, которые позволяют эффективно парсить, генерировать и трансформировать CSV-файлы с полной поддержкой типов. В этой статье мы рассмотрим три основных инструмента: csv-parse, csv-stringify и papaparse, а также разберём практические примеры их использования.

1. Библиотека csv-parse: парсинг CSV с типизацией

csv-parse — это часть экосистемы csv.js, одна из самых производительных библиотек для разбора CSV. Она поддерживает потоки (streams), кастомные разделители и строгую типизацию через TypeScript.

Установка:

npm install csv-parse
npm install @types/csv-parse  // для TypeScript (если не включены автоматически)

Пример парсинга строки CSV:

import { parse } from 'csv-parse/sync';
import { stringify } from 'csv-stringify/sync';

interface User {
  id: number;
  name: string;
  email: string;
  age: number;
}

const csvData = `id,name,email,age
1,Иван Иванов,ivan@example.com,30
2,Мария Петрова,maria@example.com,25
3,Алексей Смирнов,alex@example.com,35`;

// Парсинг с явным указанием типов
const records: User[] = parse(csvData, {
  columns: true,      // первая строка — заголовки
  skip_empty_lines: true,
  delimiter: ',',
  cast: true          // автоматическое приведение типов (строки в числа)
});

console.log(records);
// [
//   { id: 1, name: 'Иван Иванов', email: 'ivan@example.com', age: 30 },
//   { id: 2, name: 'Мария Петрова', email: 'maria@example.com', age: 25 },
//   { id: 3, name: 'Алексей Смирнов', email: 'alex@example.com', age: 35 }
// ]

2. Библиотека csv-stringify: генерация CSV из объектов

csv-stringify — парная библиотека для создания CSV-строк и файлов из массивов объектов или кортежей. Отлично подходит для экспорта данных.

Пример генерации CSV:

import { stringify } from 'csv-stringify/sync';

interface Product {
  sku: string;
  price: number;
  stock: number;
}

const products: Product[] = [
  { sku: 'PRD-001', price: 1500, stock: 10 },
  { sku: 'PRD-002', price: 2500, stock: 5 },
  { sku: 'PRD-003', price: 800, stock: 20 },
];

const csvOutput = stringify(products, {
  header: true,
  columns: ['sku', 'price', 'stock'], // порядок и фильтрация полей
});

console.log(csvOutput);
// sku,price,stock
// PRD-001,1500,10
// PRD-002,2500,5
// PRD-003,800,20

3. Библиотека PapaParse: универсальный парсер для браузера и Node.js

PapaParse — самая популярная библиотека для работы с CSV в JavaScript/TypeScript. Она работает как в браузере, так и в Node.js, поддерживает большие файлы через потоки, автоматическое определение разделителя и обработку ошибок.

Установка:

npm install papaparse
npm install @types/papaparse

Пример с обработкой файла в Node.js:

import fs from 'fs';
import Papa from 'papaparse';

interface Transaction {
  date: string;
  amount: number;
  category: string;
}

const fileContent = fs.readFileSync('transactions.csv', 'utf-8');

const result = Papa.parse<Transaction>(fileContent, {
  header: true,
  dynamicTyping: true,  // автоматическое преобразование типов
  skipEmptyLines: true,
});

if (result.errors.length > 0) {
  console.error('Ошибки парсинга:', result.errors);
} else {
  console.log('Транзакции:', result.data);
  // result.data — массив объектов Transaction
}

// Асинхронный парсинг с потоками для больших файлов
const stream = fs.createReadStream('large-file.csv');
Papa.parse(stream, {
  header: true,
  dynamicTyping: true,
  step: (row) => {
    // Обработка каждой строки по мере чтения
    console.log('Строка:', row.data);
  },
  complete: () => {
    console.log('Парсинг завершён');
  },
});

4. Продвинутые техники: кастомные типы и трансформация

Часто требуется преобразовать данные в процессе парсинга. Все три библиотеки позволяют задавать функции-трансформеры.

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