Como criar CSV usando Javascript
Introdução#
Provavelmente você já precisou criar um arquivo CSV usando Javascript. E certamente pensou que somente era necessário executar o método join
do array - eu mesmo por um tempo já fiz isso. Mas você sabia que é possível que esteja criando CSVs inválidos?
Principais problemas#
1. Separador de colunas#
O problema mais comum ao tentar criar um CSV por conta própria é que se não estiver tomando o devido cuidado pode acontecer do separador que você está utilizando aparecer dentro de uma célula. Isso fará com que aquela linha seja inválida.
const linhas = [
['coluna 1', 'coluna 2', 'coluna 3'],
['linha 1 coluna 1', 'linha 1 coluna 2', 'linha 1 coluna 3, teste'],
['linha 2 coluna 1', 'linha 2 coluna 2', 'linha 2 coluna 3'],
['linha 3 coluna 1', 'linha 3 coluna 2', 'linha 3 coluna 3'],
]
const csv = linhas.map(linha => linha.join(',')).join('\n')
console.log(csv)
O código acima irá gerar o seguinte CSV:
coluna 1,coluna 2,coluna 3
linha 1 coluna 1,linha 1 coluna 2,linha 1 coluna 3, teste
linha 2 coluna 1,linha 2 coluna 2,linha 2 coluna 3
linha 3 coluna 1,linha 3 coluna 2,linha 3 coluna 3
2. Codificação de caracteres#
Outro problema que pode acontecer é que os textos podem estar em um encoding diferente do que o CSV espera. Isso pode acontecer se você estiver usando um editor de texto que não está configurado para usar o encoding correto.
3. Colunas vazias#
Se você estiver usando o método join
do array e uma das linhas não possuir todas as colunas preenchidas, o CSV gerado pode ficar com colunas vazias.
Solução#
Para resolver esses problemas, sugiro que você utilize a biblioteca Papa Parse. Ela é uma biblioteca que permite que você leia e escreva CSVs de forma fácil e rápida; e em multi-thread.
import Papa from 'papaparse'
const linhas = [
['coluna 1', 'coluna 2', 'coluna 3'],
['linha 1 coluna 1', 'linha 1 coluna 2', 'linha 1 coluna 3, teste'],
['linha 2 coluna 1', 'linha 2 coluna 2', 'linha 2 coluna 3'],
['linha 3 coluna 1', 'linha 3 coluna 2', 'linha 3 coluna 3'],
]
const csv = Papa.unparse(linhas, {
delimiter: ',',
encoding: 'utf-8',
})
console.log(csv)