Trabalhando com CSV em Node.js: bibliotecas csv-parser e csv-writer
CSV (Comma-Separated Values) é um dos formatos mais populares para armazenar e trocar dados tabulares. No ecossistema Node.js, existem muitas ferramentas para trabalhar com este formato. Neste artigo, veremos duas bibliotecas muito convenientes e leves: csv-parser para leitura e csv-writer para escrita de arquivos CSV.
Instalação das bibliotecas
Para começar, instale ambas as bibliotecas via npm:
npm install csv-parser csv-writerLeitura de arquivos CSV com csv-parser
A biblioteca csv-parser converte dados CSV em um fluxo de objetos JavaScript. Ela funciona com base em Streams do Node.js, permitindo processar eficientemente até mesmo arquivos muito grandes sem carregá-los completamente na memória.
Exemplo básico de leitura
Vamos criar um arquivo users.csv com o seguinte conteúdo:
name,age,cityAna,28,MoscouIvan,35,São PetersburgoMaria,22,KazanAgora vamos lê-lo usando csv-parser:
const fs = require('fs');const csv = require('csv-parser');
const results = [];
fs.createReadStream('users.csv') .pipe(csv()) .on('data', (data) => results.push(data)) .on('end', () => { console.log('Registros lidos:', results.length); console.log('Primeiro registro:', results[0]); // Saída: { name: 'Ana', age: '28', city: 'Moscou' } });Configuração de separador e cabeçalhos
O csv-parser suporta várias configurações. Por exemplo, se seu CSV usar ponto e vírgula como separador:
fs.createReadStream('users.csv') .pipe(csv({ separator: ';' })) .on('data', (row) => console.log(row));Se o arquivo não tiver cabeçalhos, você pode especificá-los manualmente:
fs.createReadStream('data.csv') .pipe(csv({ headers: ['id', 'product', 'price'] })) .on('data', (row) => console.log(row));Escrita de arquivos CSV com csv-writer
A biblioteca csv-writer permite criar arquivos CSV a partir de arrays de objetos. Ela suporta diferentes codificações e separadores.
Criação de um arquivo CSV simples
const createCsvWriter = require('csv-writer').createObjectCsvWriter;
const csvWriter = createCsvWriter({ path: 'output.csv', header: [ { id: 'name', title: 'Nome' }, { id: 'age', title: 'Idade' }, { id: 'city', title: 'Cidade' } ]});
const records = [ { name: 'Ana', age: 28, city: 'Moscou' }, { name: 'Ivan', age: 35, city: 'São Petersburgo' }, { name: 'Maria', age: 22, city: 'Kazan' }];
csvWriter.writeRecords(records) .then(() => console.log('Arquivo CSV criado com sucesso'));Configurações adicionais do csv-writer
Você pode alterar o separador de campos, adicionar BOM para exibição correta de cirílico no Excel e especificar a codificação:
const createCsvWriter = require('csv-writer').createObjectCsvWriter;
const csvWriter = createCsvWriter({ path: 'output_utf8.csv', header: [ { id: 'name', title: 'Nome' }, { id: 'age', title: 'Idade' } ], fieldDelimiter: ';', alwaysQuote: true, encoding: 'utf8'});Exemplo prático: conversão de JSON para CSV
Frequentemente surge a tarefa de converter dados JSON para o formato CSV. Aqui está um exemplo completo:
const fs = require('fs');const createCsvWriter = require('csv-writer').createObjectCsvWriter;
// Dados de origemconst jsonData = [ { id: 1, product: 'Notebook', price: 75000, quantity: 10 }, { id: 2, product: 'Mouse', price: 1500, quantity: 50 }, { id: 3, product: 'Teclado', price: 3500, quantity: 30 }];
// Configuração do escritor CSVconst csvWriter = createCsvWriter({ path: 'products.csv', header: [ { id: 'id', title: 'ID' }, { id: 'product