O que o conversor faz de verdade
CSV parece o formato mais simples do mundo até você encontrar um arquivo real. Um
export de planilha com coluna de endereço, um campo de observação livre, ou um arquivo
gerado em português vai quebrar qualquer conversor construído sobre
split(",") — normalmente sem avisar. A saída parece plausível, a contagem
de linhas bate, e o dado está silenciosamente errado.
Este conversor implementa a RFC 4180, a especificação que realmente descreve o formato. Ele lê o arquivo caractere a caractere mantendo o estado de estar ou não dentro de um campo entre aspas, que é o único jeito de acertar os casos difíceis.
Os três casos que quebram conversor ingênuo
Vírgula dentro do campo
Campo entre aspas pode conter o delimitador. A linha
"Hopper, Grace",[email protected] tem dois campos, não três.
Quebrar por vírgula dá três, desloca todas as colunas seguintes e coloca um e-mail na
coluna de idade.
Aspas dentro de campo com aspas
A RFC 4180 escapa uma aspa literal duplicando ela. O campo
"Ela disse ""não"" duas vezes" contém o texto
Ela disse "não" duas vezes. Conversor que tira aspas com expressão regular
transforma isso em fragmentos.
Quebra de linha dentro do campo
Esta é a que surpreende. Um campo entre aspas pode conter quebra de linha — endereço
de várias linhas ou campo de comentário vão ter. Isso significa que
não dá para dividir o arquivo em linhas antes de interpretar, porque
linha e registro não são a mesma coisa. Qualquer ferramenta que comece com
text.split("\n") já está errada antes de olhar um único campo.
Detecção de delimitador, e por que frequência é o teste errado
Nem todo CSV usa vírgula. Arquivo gerado no Brasil, na Alemanha, na França e em quase toda a Europa continental usa ponto e vírgula, porque a vírgula é o separador decimal e o Excel se adapta ao locale do sistema. Arquivo separado por tabulação é comum em export de banco de dados e de ferramenta de analytics.
O método óbvio de detecção — contar cada candidato e escolher o mais frequente — falha exatamente nos arquivos em que importa. Um export separado por ponto e vírgula com uma coluna de texto livre cheia de prosa vai ter muito mais vírgulas que ponto e vírgulas, então a frequência escolhe a vírgula e o arquivo inteiro colapsa numa coluna só.
Nós pontuamos por consistência. O delimitador de verdade produz a mesma contagem em toda linha, porque toda linha tem o mesmo número de colunas. Vírgula espalhada em prosa produz contagem diferente a cada linha. Medir o quanto a contagem é uniforme nas primeiras vinte linhas, em vez do quanto ela é grande, identifica o separador correto mesmo quando ele é bem menos frequente. Trechos entre aspas são ignorados na contagem pela mesma razão.
Inferência de tipo sem perder dado
JSON distingue texto, número, booleano e nulo; CSV só tem texto. Converter
36 para número normalmente é o que se quer. Converter 007
para número é perda de dado, e é a forma mais comum de uma conversão corromper um
arquivo em silêncio.
Nossa regra é um teste de ida e volta: um valor vira número só se formatar esse número de volta para texto produzir exatamente a string original. Então:
42→42, porqueString(42)é"42".007continua"007", porqueString(7)é"7".1,50continua texto, porque o zero final desapareceria.+55 11 98765-4321continua texto — nem é número.1e5vira100000só quando a ida e volta bate.
Isso mantém CEP, telefone, código de produto, conta bancária e número de versão
intactos. true, false e null viram o equivalente
em JSON, e célula vazia vira null em vez de string vazia, que é o que a
maioria dos consumidores espera. Se preferir tudo como texto, desligue a inferência.
Três formatos de saída, e quando usar cada um
| Formato | Aparência | Use quando |
|---|---|---|
| Lista de objetos | [{"nome":"Ada","idade":36}] | O padrão. Alimentar uma API, um app JS, ou algo que lê por nome de campo. |
| Lista de listas | [["nome","idade"],["Ada",36]] | Posição importa mais que nome, ou o arquivo não tem cabeçalho útil. |
| NDJSON | Um objeto por linha, sem lista externa | Carga em BigQuery, Elasticsearch, ou qualquer loader linha a linha. |
Cabeçalho: repetido e vazio
Chave de objeto JSON precisa ser única, e cabeçalho de CSV frequentemente não é. Uma
planilha com duas colunas chamadas observacao perderia uma delas — a
segunda sobrescreve a primeira em silêncio. Renomeamos a colisão para
observacao e observacao_2 para as duas sobreviverem. Célula
de cabeçalho vazia vira column_3, numerada pela posição, em vez de uma
chave vazia que é desconfortável de acessar em código.
Se o arquivo não tem cabeçalho, desmarque a opção e cada coluna recebe o nome
column_1 até column_n pela posição.
Codificação e o caractere invisível do Excel
O Excel escreve um byte order mark no início de arquivo CSV em UTF-8.
Ele é invisível em qualquer editor, mas vira parte da primeira célula do cabeçalho —
e é por isso que gente acaba com uma chave JSON que parece nome, se recusa
a casar com "nome" no código, e consome uma tarde de depuração. Nós
removemos automaticamente. Arquivos são lidos como UTF-8, o que cobre acento, cedilha
e o resto.
Linhas irregulares
Quando uma linha tem mais valores do que o cabeçalho tem colunas, alguma coisa está
errada no arquivo — normalmente um delimitador não escapado. A correção tentadora é
descartar os extras. Nós mantemos como _1, _2 e mostramos um
aviso nomeando a linha, porque conversão que joga dado fora em silêncio é pior que uma
que produz chave feia. Linha com menos valores recebe null nos
campos faltantes.
Privacidade
Cada etapa acontece nesta aba. O arquivo nunca sai do seu aparelho, o que importa mais do que parece: export de CSV é, na esmagadora maioria, lista de cliente, histórico de transação, folha de pagamento e dump de CRM. Colar isso num conversor server-side é entregar uma cópia dos dados dos seus clientes para um terceiro que você nunca auditou. Aqui não há o que auditar, porque não há upload — dá para verificar abrindo a aba de rede do navegador, ou simplesmente desconectando e convertendo assim mesmo.
Perguntas frequentes
Meu arquivo é enviado para algum servidor?
Não. O parser roda no seu navegador, em JavaScript puro. Nada é enviado, nada é registrado e não existe cadastro. Você pode desconectar da internet que a ferramenta continua funcionando — o que a torna segura para export de clientes, folha de pagamento e qualquer coisa sob confidencialidade.
Meus CEPs e telefones vão perder o zero à esquerda?
Perderiam, se convertêssemos tudo que parece número. Não convertemos. A inferência de tipo só converte valor que sobrevive à ida e volta: 42 vira número porque String(42) é exatamente "42", mas 007 continua texto porque String(7) é "7", não "007". CEP, telefone, código de produto e número de conta mantêm o texto original. Se quiser tudo como texto mesmo assim, desmarque a opção.
Meu CSV tem vírgula dentro do campo. Vai quebrar?
Não. Campo entre aspas pode conter vírgula, ponto e vírgula, quebra de linha e aspas. Aspa dentro de campo com aspas se escreve duplicando a aspa, que é a regra da RFC 4180, e o parser trata isso. É exatamente aqui que conversor feito com split de vírgula produz lixo silencioso.
E se uma linha tiver mais valores que o cabeçalho?
Nada é descartado. Os valores extras viram _1, _2 e um aviso diz qual linha estava irregular. Jogar fora em silêncio é pior que uma chave feia, porque você nunca ficaria sabendo que perdeu dado.
Qual o tamanho máximo de arquivo?
O limite é a memória da sua aba, não um teto artificial. Arquivos de dezenas de megabytes convertem em um ou dois segundos num notebook comum. Arquivo muito grande pede ferramenta de streaming, porque aqui tudo fica em memória de uma vez.