Trabalhando com CSV em TypeScript: guia completo
CSV (Comma-Separated Values) — um dos formatos mais comuns para troca de dados tabulares. No ecossistema TypeScript, existem várias bibliotecas poderosas que permitem ler, escrever e transformar arquivos CSV com suporte total a tipos. Neste artigo, abordaremos as principais ferramentas, sua instalação e exemplos práticos.
Bibliotecas populares para trabalhar com CSV
As bibliotecas mais usadas no ambiente TypeScript/Node.js:
csv-parse— parte do conjuntocsv, um parser confiável com suporte a streamspapaparse— um parser versátil para navegador e Node.jscsv-stringify— gerador de CSV a partir de arrays/objetoscsvtojson— conversor de CSV para JSON com tipagem
Instalação e configuração
Para projetos em TypeScript, a instalação é feita via npm ou yarn:
npm install csv-parse csv-stringify papaparse @types/papaparseSe você usar csv-parse, tipos adicionais não são necessários — a biblioteca tem suporte nativo a TypeScript.
Exemplo 1: Parsing de CSV com csv-parse
A biblioteca csv-parse é ideal para trabalhar com arquivos grandes graças à API de stream. Veja um exemplo 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, // primeira linha — cabeçalhos 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 }// ]Exemplo 2: Geração de CSV com tipagem
Para criar arquivos CSV, use csv-stringify. Vamos definir um tipo de dado e gerar uma string:
import { stringify } from 'csv-stringify/sync';
interface Product { productId: string; name: string; price: number; inStock: boolean;}
const products: Product[] = [ { productId: 'P001', name: 'Notebook', price: 75000, inStock: true }, { productId: 'P002', name: 'Mouse', 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,Notebook,75000,true// P002,Mouse,1500,false// P003,Teclado,3500,trueExemplo 3: Usando PapaParse no navegador
PapaParse é ideal para processamento de CSV no lado do cliente. Exemplo com upload de arquivo 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, // conversão automática de tipos skipEmptyLines: true, complete: (result) => { console.log('Parsing concluído:', result.data); // result.data — array de objetos Transaction }, error: (error) => { console.error('Erro no parsing:', error); } });});