Trabajo con CSV en TypeScript: guía completa
CSV (Comma-Separated Values) es uno de los formatos más populares para el intercambio de datos tabulares. En TypeScript (y JavaScript) existen varias bibliotecas potentes para analizar, generar y procesar archivos CSV. En este artículo, revisaremos las herramientas principales, sus capacidades y proporcionaremos ejemplos prácticos.
¿Por qué usar bibliotecas para CSV?
Las herramientas integradas de JavaScript (por ejemplo, split(',')) no manejan casos complejos:
- Comillas escapadas y comas dentro de campos
- Diferentes delimitadores (punto y coma, tabulación)
- Diferentes codificaciones y BOM
- Valores multilínea
- Diferentes tipos de final de línea (CRLF, LF)
Las bibliotecas profesionales resuelven todos estos problemas y proporcionan una API conveniente para trabajar con datos.
1. csv-parse — análisis de CSV en Node.js y navegador
csv-parse es parte del ecosistema csv.js, una de las bibliotecas de análisis más populares. Funciona tanto en Node.js como en el navegador (a través de un bundler).
Instalación
npm install csv-parseEjemplo de uso con 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, // primera fila son encabezados skip_empty_lines: true, delimiter: ',', cast: (value, context) => { if (context.column === 'id') return parseInt(value, 10); return value; }});
console.log(records);2. PapaParse — analizador universal para navegador y Node.js
PapaParse es una biblioteca con excelente soporte para archivos grandes (procesamiento por flujo), detección automática de delimitadores y amplias opciones de configuración.
Instalación
npm install papaparseEjemplo con tipificación de resultados
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, // conversión automática de tipos skipEmptyLines: true});
if (result.errors.length > 0) { console.error('Errores de análisis:', result.errors);} else { result.data.forEach(product => { console.log(`Producto ${product.sku}: ${product.price} EUR`); });}3. csv-stringify — generación de CSV a partir de datos
Para la tarea inversa — crear CSV a partir de arrays de objetos — use csv-stringify. También forma parte del ecosistema csv.js.
Instalación
npm install csv-stringifyEjemplo de generación 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: 'Iván Petrov', total: 1500.50 }, { orderId: 1002, customer: 'María Sidorova', total: 2300.00 }, { orderId: 1003, customer: 'Alexéi Ivanov', total: 890.75 }];
const csvOutput = stringify(orders, { header: true, columns: ['orderId', 'customer', 'total']});
writeFileSync('orders.csv', csvOutput, 'utf-8');console.log('Archivo CSV creado exitosamente');4. Manejo de errores y validación de datos
Al trabajar con CSV, es importante manejar los errores correctamente. Veamos un ejemplo con verificación de datos:
import Papa from 'papaparse';
interface ValidatedRow { isValid: boolean; errors: s