Trabajo con CSV en TypeScript: guía completa
CSV (Comma-Separated Values) es uno de los formatos más comunes para el intercambio de datos tabulares. En el ecosistema de TypeScript hay varias bibliotecas potentes que permiten leer, escribir y transformar archivos CSV con soporte completo de tipos. En este artículo analizaremos las herramientas principales, su instalación y ejemplos prácticos.
Bibliotecas populares para trabajar con CSV
Las bibliotecas más utilizadas en el entorno TypeScript/Node.js son:
csv-parse— parte del conjuntocsv, un analizador confiable con soporte para streamspapaparse— un analizador universal para navegador y Node.jscsv-stringify— generador de CSV a partir de arrays/objetoscsvtojson— convertidor de CSV a JSON con tipificación
Instalación y configuración
Para proyectos en TypeScript, la instalación se realiza a través de npm o yarn:
npm install csv-parse csv-stringify papaparse @types/papaparseSi usas csv-parse, no se requieren tipos adicionales: la biblioteca tiene soporte integrado para TypeScript.
Ejemplo 1: Análisis de CSV con csv-parse
La biblioteca csv-parse es ideal para trabajar con archivos grandes gracias a su API de streams. Veamos un ejemplo básico:
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, // primera fila como encabezados 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: 'Iván', email: 'ivan@example.com', age: 30 },// { id: 2, name: 'María', email: 'maria@example.com', age: 25 }// ]Ejemplo 2: Generación de CSV con tipificación
Para crear archivos CSV, usa csv-stringify. Definamos el tipo de datos y generemos una cadena:
import { stringify } from 'csv-stringify/sync';
interface Product { productId: string; name: string; price: number; inStock: boolean;}
const products: Product[] = [ { productId: 'P001', name: 'Portátil', price: 75000, inStock: true }, { productId: 'P002', name: 'Ratón', price: 1500, inStock: false }, { productId: 'P003', name: 'Teclado', price: 3500, inStock: true }];
const csvOutput = stringify(products, { header: true, columns: ['productId', 'name', 'price', 'inStock']});
console.log(csvOutput);// productId,name,price,inStock// P001,Portátil,75000,true// P002,Ratón,1500,false// P003,Teclado,3500,trueEjemplo 3: Uso de PapaParse en el navegador
PapaParse es ideal para el procesamiento de CSV en el lado del cliente. Ejemplo con carga de archivo mediante 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, // conversión automática de tipos skipEmptyLines: true, complete: (result) => { console.log('Análisis completado:', result.data); // result.data — array de objetos Transaction }, error: (error) => { console.error('Error de análisis:', error); } });});