Travailler avec CSV en TypeScript : guide complet
CSV (Comma-Separated Values) est l'un des formats les plus courants pour l'échange de données tabulaires. Dans l'écosystème TypeScript, plusieurs bibliothèques puissantes sont disponibles pour lire, écrire et transformer des fichiers CSV avec une prise en charge complète des types. Dans cet article, nous examinerons les principaux outils, leur installation et des exemples pratiques.
Bibliothèques populaires pour travailler avec CSV
Les bibliothèques les plus fréquemment utilisées dans l'environnement TypeScript/Node.js :
csv-parse— fait partie de l'ensemblecsv, un analyseur fiable avec prise en charge des fluxpapaparse— un analyseur universel pour le navigateur et Node.jscsv-stringify— un générateur de CSV à partir de tableaux/objetscsvtojson— un convertisseur CSV en JSON avec typage
Installation et configuration
Pour les projets TypeScript, l'installation se fait via npm ou yarn :
npm install csv-parse csv-stringify papaparse @types/papaparseSi vous utilisez csv-parse, aucun type supplémentaire n'est nécessaire — la bibliothèque dispose d'une prise en charge intégrée de TypeScript.
Exemple 1 : Analyse CSV avec csv-parse
La bibliothèque csv-parse est idéale pour travailler avec de gros fichiers grâce à son API de flux. Voici un exemple de base :
import { parse } from 'csv-parse/sync';import * as fs from 'fs';
interface User { id: number; name: string; email: string; age: number;}
const csvData = fs.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' || context.column === 'age') { return Number(value); } return value; }});
console.log(records);// [// { id: 1, name: 'Ivan', email: 'ivan@example.com', age: 30 },// { id: 2, name: 'Maria', email: 'maria@example.com', age: 25 }// ]Exemple 2 : Génération CSV avec typage
Pour créer des fichiers CSV, utilisez csv-stringify. Définissons un type de données et générons une chaîne :
import { stringify } from 'csv-stringify/sync';
interface Product { productId: string; name: string; price: number; inStock: boolean;}
const products: Product[] = [ { productId: 'P001', name: 'Ordinateur portable', price: 75000, inStock: true }, { productId: 'P002', name: 'Souris', price: 1500, inStock: false }, { productId: 'P003', name: 'Clavier', price: 3500, inStock: true }];
const csvOutput = stringify(products, { header: true, columns: ['productId', 'name', 'price', 'inStock']});
console.log(csvOutput);// productId,name,price,inStock// P001,Ordinateur portable,75000,true// P002,Souris,1500,false// P003,Clavier,3500,trueExemple 3 : Utilisation de PapaParse dans le navigateur
PapaParse est idéal pour le traitement côté client des CSV. Exemple avec chargement de fichier via input :
import Papa from 'papaparse';
interface Transaction { date: string; amount: number; category: string; description: string;}
const fileInput = document.getElementById('csvInput') as HTMLInputElement;
fileInput.addEventListener('change', (event) => { const file = (event.target as HTMLInputElement).files?.[0]; if (!file) return;
Papa.parse<Transaction>(file, { header: true, dynamicTyping: true, // conversion automatique des types skipEmptyLines: true, complete: (result) => { console.log('Analyse terminée :', result.data); // result.data — tableau d'objets Transaction }, error: (error) => { console.error('Erreur d'analyse :', error); } });});