Converter CSV para JSON
Cole um CSV, ou carregue um arquivo, e receba de volta um array JSON. Isto é um parser de verdade, e não um split por vírgulas, então os campos entre aspas que contêm vírgulas, quebras de linha e aspas duplicadas sobrevivem inteiros. O delimitador é detectado a partir das primeiras linhas, a menos que você escolha um.
A detecção lê as cinco primeiras linhas e escolhe o caractere que divide todas elas na mesma quantidade de campos.
Minifique quando a saída vai para o corpo de uma requisição, e não para os seus olhos.
O arquivo é lido pelo seu navegador e nunca sai dele. Qualquer coisa acima de 5 MB é recusada, porque a página travaria.
Por que dividir por vírgulas está errado
A primeira versão de todo leitor de CSV é line.split(','), e ela funciona até os dados trazerem uma vírgula. A partir daí ela continua quase funcionando, o que é pior. Três características do formato a quebram:
- Campos entre aspas.
"Lovelace, Ada"é um campo só. Um split ingênuo transforma isso em dois e desloca todas as colunas seguintes. - Aspas duplicadas. Dentro de um campo entre aspas, uma aspa dupla literal é escrita duas vezes:
"She said ""no"""é o valor únicoShe said "no". A barra invertida não é caractere de escape no CSV. - Quebras de linha dentro dos campos. Um campo entre aspas pode conter quebras de linha, então uma linha de CSV não é a mesma coisa que uma linha de texto. Ler o arquivo linha a linha já é um bug.
O parser daqui é uma máquina de estados que avança caractere por caractere, que é o único jeito de acertar as três coisas. Ele também tolera os desvios comuns: um CR sozinho, um LF sozinho e CRLF terminam uma linha igualmente, e uma aspa que aparece no meio de um campo sem aspas é tratada como caractere comum, não como erro.
A conversão de tipos e a regra rígida que a torna segura
CSV não tem tipos. Todo campo é texto, então transformar 42 em número é um palpite: um palpite útil, e também a causa de muita perda silenciosa de dados. A implementação usual chama o parser numérico da linguagem e fica com o que vier, e é assim que o CEP 01234 vira 1234 e o número de peça 1.50 vira 1.5.
A regra usada aqui é mais estreita: um campo vira número só se converter esse número de volta para texto produzir exatamente os caracteres originais. 42 passa. 007, 1.50, +44, 1e3 e qualquer inteiro grande o bastante para perder precisão não passam no teste e continuam como strings. true e false viram booleanos, um campo vazio vira null, e o resto fica como está.
Datas nunca são convertidas, porque JSON não tem tipo de data e a única coisa pior que uma data em texto é uma data errada. 03/04/2024 é março nos Estados Unidos e abril em quase todo o resto do mundo, e nenhum parser consegue saber qual das duas a partir do arquivo. Mantenha-as como strings ISO-8601 e deixe quem for consumir decidir.
A falha que você precisa conhecer
Uma única aspa dupla sem par destrói o resto do arquivo. Daquele caractere em diante o parser acha que está dentro de um campo entre aspas, então delimitadores e quebras de linha viram texto comum e tudo desaba em um valor gigante só. Essa é a maneira mais comum de uma importação de CSV dar errado, e em geral vem de um campo com um símbolo de polegadas ou uma aspa tipográfica que nunca foi escapada. A ferramenta detecta esse estado e avisa, mas não tem como adivinhar onde a aspa deveria ter sido fechada. Procure na entrada uma " solta e conserte ali.
Linhas irregulares são tratadas em vez de rejeitadas. Uma linha com menos campos que o cabeçalho recebe null no que falta; uma linha com mais guarda os excedentes sob nomes column_N. As duas são relatadas, porque as duas normalmente significam que o arquivo está danificado, não que ele é incomum.
O que isto não consegue fazer
Não consegue consertar a codificação. Quando o texto chega à caixa ele já foi decodificado, então se você vê José o estrago aconteceu ao salvar ou ao abrir o arquivo: reabra o original como UTF-8 em vez de tentar remendá-lo aqui. A marca de ordem de bytes do começo é removida, o que impede que um caractere invisível grude no nome da sua primeira coluna.
Não trabalha em streaming. Tudo fica na memória, então o carregamento de arquivo é limitado a 5 MB e o texto colado não tem limite formal, mas tem o mesmo limite prático. Também não existe noção de esquema: estrutura aninhada não pode ser reconstruída a partir de colunas planas, então address.city chega como uma chave com um ponto no meio, não como um objeto aninhado.
Perguntas frequentes
O arquivo que eu escolho é enviado para algum lugar?
Não. Ele é lido com o FileReader do navegador, que entrega o texto direto para a página. Não há servidor envolvido nem requisição de rede, que é também o motivo do limite de tamanho: tudo acontece na memória desta aba.
Por que meus CEPs mantiveram os zeros à esquerda?
Porque o conversor só cria um número quando esse número é impresso de volta com os mesmos caracteres, e 1234 não é 01234. Isso é deliberado. Se você realmente quer números ali, desligue "Converter números e booleanos" e converta a coluna depois.
Meu arquivo usa ponto e vírgula. Funciona?
Sim. A detecção costuma reconhecer, e você pode forçar pelo menu de delimitador. Ponto e vírgula é o padrão nas exportações do Excel em países onde a vírgula é o separador decimal, então um CSV europeu com ponto e vírgula não está quebrado.
O que acontece com linhas que têm outra quantidade de campos?
Elas são mantidas. Linhas curtas recebem null nas colunas que faltam, linhas longas guardam os valores extras sob chaves column_N, e um aviso diz quantas de cada tipo apareceram. Nada é descartado em silêncio.
Posso obter um array de arrays em vez de objetos?
Desligue "A primeira linha é o cabeçalho" e cada linha vira um objeto com as chaves column_1, column_2 e assim por diante, inclusive a primeira. Não existe um modo array de arrays puro, porque na prática as chaves deixam a saída muito mais fácil de usar.
Última atualização 19 de setembro de 2026