Travailler avec CSV en TypeScript : guide complet
CSV (Comma-Separated Values) est l'un des formats les plus populaires pour l'échange de données tabulaires. En TypeScript (et JavaScript), il existe plusieurs bibliothèques puissantes pour le parsing, la génération et le traitement de fichiers CSV. Dans cet article, nous examinerons les principaux outils, leurs fonctionnalités et fournirons des exemples pratiques.
Pourquoi utiliser des bibliothèques pour CSV ?
Les outils intégrés de JavaScript (par exemple, split(',')) ne prennent pas en compte les cas complexes :
- Guillemets échappés et virgules à l'intérieur des champs
- Séparateurs différents (point-virgule, tabulation)
- Encodages différents et BOM
- Valeurs multilignes
- Différents types de fins de ligne (CRLF, LF)
Les bibliothèques professionnelles résolvent tous ces problèmes et fournissent une API pratique pour travailler avec les données.
1. csv-parse — parsing CSV dans Node.js et le navigateur
csv-parse fait partie de l'écosystème csv.js, l'une des bibliothèques de parsing les plus populaires. Elle fonctionne à la fois dans Node.js et dans le navigateur (via un bundler).
Installation
npm install csv-parseExemple d'utilisation avec TypeScript
import { parse } from 'csv-parse/sync';import { readFileSync } from 'fs';
interface User { id: number; name: string; email: string;}
const csvData = readFileSync('users.csv', 'utf-8');const records: User[] = parse(csvData, { columns: true, // première ligne — en-têtes skip_empty_lines: true, delimiter: ',', cast: (value, context) => { if (context.column === 'id') return parseInt(value, 10); return value; }});
console.log(records);2. PapaParse — parseur universel pour navigateur et Node.js
PapaParse est une bibliothèque avec un excellent support des fichiers volumineux (traitement par flux), une détection automatique du séparateur et de nombreuses options de configuration.
Installation
npm install papaparseExemple avec typage des résultats
import Papa from 'papaparse';
interface Product { sku: string; price: number; quantity: number;}
const csvString = `sku,price,quantityABC-001,29.99,100ABC-002,49.50,50`;
const result = Papa.parse<Product>(csvString, { header: true, dynamicTyping: true, // conversion automatique des types skipEmptyLines: true});
if (result.errors.length > 0) { console.error('Erreurs de parsing :', result.errors);} else { result.data.forEach(product => { console.log(`Produit ${product.sku} : ${product.price} €`); });}3. csv-stringify — génération de CSV à partir de données
Pour la tâche inverse — créer un CSV à partir de tableaux d'objets — utilisez csv-stringify. Il fait également partie de l'écosystème csv.js.
Installation
npm install csv-stringifyExemple de génération de CSV
import { stringify } from 'csv-stringify/sync';import { writeFileSync } from 'fs';
interface Order { orderId: number; customer: string; total: number;}
const orders: Order[] = [ { orderId: 1001, customer: 'Ivan Petrov', total: 1500.50 }, { orderId: 1002, customer: 'Maria Sidorova', total: 2300.00 }, { orderId: 1003, customer: 'Alexei Ivanov', total: 890.75 }];
const csvOutput = stringify(orders, { header: true, columns: ['orderId', 'customer', 'total']});
writeFileSync('orders.csv', csvOutput, 'utf-8');console.log('Fichier CSV créé avec succès');4. Gestion des erreurs et validation des données
Lors du travail avec CSV, il est important de gérer correctement les erreurs. Voici un exemple avec vérification des données :
import Papa from 'papaparse';
interface ValidatedRow { isValid: boolean; errors: s Aussi dans la bibliothèque
Jest pour TypeScript : Guide complet de test
Event Bus et le pattern Observer en Rust : implémentation d'une architecture événementielle
Journalisation pour TypeScript : la bibliothèque Winston
Mise en cache en TypeScript : bibliothèque node-cache