Ir para o conteúdo

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)

Referências#