Como converter CSV para JSON (e o inverso)
A conversão parece trivial até aparecer uma vírgula dentro de um campo. Este guia cobre os detalhes que quebram a implementação ingênua.
Os três problemas do CSV
- Delimitador: no Brasil o Excel usa ponto e vírgula, porque a vírgula é o separador decimal
- Aspas: um campo pode conter o delimitador, quebra de linha ou aspas, e nesse caso vem entre aspas duplas, com as aspas internas duplicadas
- Tipos: tudo em CSV é texto. Quem converte precisa decidir o que vira número, booleano e nulo — e cuidado com códigos que começam por zero
Em Python
A biblioteca padrão já trata aspas e delimitador corretamente. DictReader usa a primeira linha como cabeçalho.
import csv, json
with open("dados.csv", encoding="utf-8", newline="") as arquivo:
linhas = list(csv.DictReader(arquivo, delimiter=";"))
print(json.dumps(linhas, ensure_ascii=False, indent=2))
# de volta para CSV
with open("saida.csv", "w", encoding="utf-8", newline="") as arquivo:
escritor = csv.DictWriter(arquivo, fieldnames=linhas[0].keys(), delimiter=";")
escritor.writeheader()
escritor.writerows(linhas)Em JavaScript
Não existe parser de CSV nativo. Um split por vírgula funciona até o primeiro campo com aspas — abaixo, uma leitura que trata o caso.
function csvParaJson(texto, delimitador = ",") {
const registros = [];
let campo = "";
let registro = [];
let entreAspas = false;
for (let i = 0; i < texto.length; i++) {
const c = texto[i];
if (entreAspas) {
if (c === '"' && texto[i + 1] === '"') { campo += '"'; i++; }
else if (c === '"') entreAspas = false;
else campo += c;
continue;
}
if (c === '"') entreAspas = true;
else if (c === delimitador) { registro.push(campo); campo = ""; }
else if (c === "\n") { registro.push(campo); registros.push(registro); campo = ""; registro = []; }
else if (c !== "\r") campo += c;
}
if (campo || registro.length) { registro.push(campo); registros.push(registro); }
const [cabecalho, ...linhas] = registros;
return linhas.map((linha) =>
Object.fromEntries(cabecalho.map((chave, i) => [chave, linha[i] ?? ""]))
);
}A armadilha dos tipos
Converter todo campo numérico para número parece uma boa ideia até um CEP virar 1310 em vez de 01310. Códigos, documentos e telefones devem permanecer como texto — a regra prática é converter apenas o que você vai usar em conta.
Perguntas frequentes
- Por que o Excel abre meu CSV tudo em uma coluna?
- Porque o Excel em português espera ponto e vírgula como separador de colunas. Gere o arquivo com ponto e vírgula, ou use a importação de dados escolhendo o delimitador manualmente.
- Como evitar que o CEP perca o zero à esquerda?
- Mantenha o campo como texto na conversão. A regra prática é converter para número apenas os campos que entram em cálculo; identificadores e códigos ficam como string.