Pular para o conteúdo principal
DevTools by Decussi
  • Ferramentas
  • Dados
  • Segurança
  • Rede
  • Texto
  • Data
  • Web
  • Dev
  • SEO
  • Brasil
Ferramentas
DevTools

Ferramentas para desenvolvedores, em português. Sem cadastro e sem instalação.

Criado e mantido por Decussi

Ferramentas

  • Todas as ferramentas
  • Dados
  • Segurança
  • Rede
  • Texto
  • Data
  • Web
  • Dev
  • SEO
  • Brasil

Referência

  • Consulta rápida
  • Guias
  • Códigos HTTP
  • Cron
  • Checagens de SEO

Desenvolvedores

  • API e devs
  • llms.txt
  • ai.txt
  • Sitemap

Newsletter

Receba novidades e novas ferramentas no seu email.

Sugira uma ferramenta

Tem uma ideia? Envie sua sugestão.

  1. Início
  2. /Guias
  3. /Conversões

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.

python
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.

javascript
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.

Resolva na prática

  • JSON ↔ CSV
  • Visualizador de CSV
  • JSON para TypeScript

Guias relacionados

  • JSON vs XML: diferenças, quando usar cada um e como converter