Trabalhando com CSV em JavaScript (Node.js): guia completo
CSV (Comma-Separated Values) — um dos formatos mais populares para troca de dados tabulares. No ecossistema Node.js, existem várias bibliotecas poderosas para parsing, geração e processamento de arquivos CSV. Neste artigo, abordaremos as principais ferramentas, sua instalação, exemplos de uso e melhores práticas.
Bibliotecas populares para trabalhar com CSV em Node.js
Em JavaScript (Node.js), três bibliotecas são mais frequentemente usadas para trabalhar com CSV:
- csv-parser — parser rápido em streaming, operando em modo streaming
- csv-stringify — gerador de CSV a partir de objetos ou arrays JavaScript
- fast-csv — biblioteca universal que combina parsing e geração
Instalação das bibliotecas
Para instalar os pacotes necessários, use npm:
npm install csv-parser csv-stringify fast-csvParsing de CSV com csv-parser
A biblioteca csv-parser opera em modo streaming, permitindo processar arquivos de qualquer tamanho sem carregá-los completamente na memória.
Exemplo: leitura de arquivo CSV
const fs = require('fs');const csv = require('csv-parser');
const results = [];
fs.createReadStream('data.csv') .pipe(csv()) .on('data', (row) => { results.push(row); }) .on('end', () => { console.log('Arquivo CSV processado com sucesso'); console.log('Primeira linha:', results[0]); });Por padrão, csv-parser usa a primeira linha do arquivo como cabeçalhos e retorna objetos com as chaves correspondentes.
Geração de CSV com csv-stringify
A biblioteca csv-stringify permite criar strings CSV a partir de arrays ou objetos JavaScript.
Exemplo: criação de CSV a partir de objetos
const { stringify } = require('csv-stringify');const fs = require('fs');
const data = [ { name: 'Ivan', age: 25, city: 'Moscou' }, { name: 'Maria', age: 30, city: 'São Petersburgo' }, { name: 'Alexei', age: 28, city: 'Kazan' }];
const writableStream = fs.createWriteStream('output.csv');
const stringifier = stringify({ header: true, columns: ['name', 'age', 'city']});
stringifier.pipe(writableStream);data.forEach(row => stringifier.write(row));stringifier.end();Solução universal: fast-csv
fast-csv oferece tanto parsing quanto geração de CSV, além de suportar diversos formatos (TSV, delimitadores personalizados).
Exemplo: parsing de CSV com fast-csv
const fs = require('fs');const csv = require('@fast-csv/parse');
const rows = [];
fs.createReadStream('data.csv') .pipe(csv.parse({ headers: true })) .on('error', error => console.error(error)) .on('data', row => rows.push(row)) .on('end', (rowCount) => { console.log(`Processadas ${rowCount} linhas`); console.log('Dados:', rows); });Exemplo: escrita de CSV com fast-csv
const fs = require('fs');const csv = require('@fast-csv/format');
const data = [ ['Nome', 'Idade', 'Cidade'], ['Ivan', '25', 'Moscou'], ['Maria', '30', 'São Petersburgo']];
const ws = fs.createWriteStream('output.csv');csv.write(data, { headers: true }).pipe(ws);Trabalhando com arquivos grandes e desempenho
Ao trabalhar com arquivos CSV maiores que 100 MB, recomenda-se o uso de processamento em streaming. Todas as três bibliotecas abordadas suportam streams.
Exemplo: processamento de CSV grande linha por linha
const fs = require('fs');const csv = require('csv-parser');
let rowCount = 0;
fs.createReadStream('large-file.csv') .pipe(csv()) .on('data', (row) => { rowC