Converter CSV para NDJSON

Aqui você converte CSV para NDJSON de graça e sem conta: solte o arquivo acima e em poucos segundos o resultado está pronto para baixar. A conversão acontece dentro do seu próprio navegador, então o arquivo nunca é enviado. Funciona igual no Windows, no macOS e no Linux e também no iPhone e no Android, e continua funcionando mesmo se você cortar a conexão.

  • Onde roda No seu navegador. O arquivo nunca é enviado.
  • Sem perdas Nada é descartado. O NDJSON guarda exatamente o que o CSV guardava.
  • Limite de tamanho Até 100 MB por arquivo, de graça e sem conta.

Até 100 arquivos de uma vez. Formatos misturados não são problema.

A linha de cabeçalho se move para dentro de cada linha

Um CSV nomeia suas colunas uma vez, no topo, e toda linha depois disso é posicional — o terceiro campo é a cidade porque o terceiro cabeçalho disse isso. O NDJSON faz o oposto: cada linha é um objeto completo carregando suas próprias chaves, então o registro número setenta mil é tão compreensível sozinho quanto o primeiro.

Essa é a troca que a conversão faz, e não é de graça. Repetir os nomes das chaves em toda linha torna o arquivo maior, às vezes consideravelmente, numa tabela de valores curtos com cabeçalhos longos. O que se ganha é que nenhuma linha depende de nenhuma outra.

Duas exportações CSV que discordam sobre suas colunas

O motivo comum de esta conversão ser pedida não é elegância. É ter onze exportações mensais, o sistema acrescentou um campo em abril, e não há como concatenar um arquivo de quatorze colunas com um de quinze. Juntar os CSVs deixa uma linha de cabeçalho no meio dos dados.

O NDJSON não tem esse problema. Registros com conjuntos de chaves diferentes convivem no mesmo arquivo legitimamente, e qualquer consumidor razoável — um motor de consulta, um job de carga, um script — trata uma chave ausente como ausente, não como linha quebrada.

Dividindo, anexando e retomando uma exportação convertida

Como um registro termina onde a linha termina, o arquivo pode ser cortado em qualquer ponto de quebra de linha e as duas metades continuam válidas. split -l 100000 produz pedaços carregáveis. head -n 1000 produz uma amostra que dá para de fato testar contra um esquema. Uma carga que falhou pode ser retomada a partir de um número de linha em vez de recomeçar do zero.

Anexar funciona pelo mesmo motivo: novos registros vão para o fim com >> e nada acima precisa ser reescrito. Fazer o equivalente com um CSV exige conferir se o cabeçalho está presente, se a ordem das colunas bate e se a última linha terminava com quebra de linha.

Tipos vêm do interpretador de CSV, e ele está adivinhando

JSON distingue o número 7 da string "7" e um CSV não, então algo precisa decidir, e o que decide é inferência sobre o texto. Valores que se interpretam como números viram números JSON — 1e5 chega na saída como 100000 — enquanto true e false viram booleanos e o resto continua string.

A adivinhação acerta para quantidades, preços e sinalizadores e erra para identificadores. 007 vira 7, e uma vez que é um número no JSON não há como recuperar o zero à esquerda. Se a exportação contém códigos em vez de medidas, a defesa mais barata é torná-los inequívocos na origem: um prefixo, ou uma coluna já exportada como texto.

Um campo CSV vazio vira null

Uma célula em branco é escrita como null em vez de string vazia. Isso é uma decisão real e vale saber, porque as duas coisas não são iguais para nada que consuma o arquivo: um esquema JSON com "type": "string" rejeita null, e uma carga de banco de dados vai colocar um null onde talvez você esperasse a string vazia que viu na origem.

O que a conversão não consegue fazer é dizer qual das duas a exportação quis dizer. Um CSV tem exatamente um jeito de escrever "nada aqui", usado tanto para "este campo está em branco" quanto para "este campo não se aplica". Se a distinção importa a jusante, ela precisa ser codificada na origem antes de qualquer conversão.

Lendo o resultado com jq e outras ferramentas de linha

O arquivo é feito para jq -c, que lê um valor por vez sem segurar o arquivo inteiro em memória. jq -r ".cidade" sobre uma exportação convertida imprime uma cidade por linha; jq -s "length" conta registros; um filtro select produz um NDJSON menor que continua sendo entrada válida para tudo mais.

O mesmo vale para qualquer coisa que leia linhas. grep sobre o arquivo bruto funciona e é honesto, porque um registro não pode se espalhar por duas linhas nem ser quebrado no meio de um match. wc -l dá a contagem exata de registros, algo pequeno até você comparar com contar linhas num CSV onde um endereço entre aspas contém uma quebra de linha.

Quanto maior o NDJSON fica em relação ao CSV

Espere crescimento. Toda linha repete os nomes das chaves, toda string vem entre aspas, e a pontuação de um objeto é adicionada em torno dos valores. Numa tabela de códigos curtos com cabeçalhos descritivos o arquivo pode dobrar; numa tabela de campos de texto longo a diferença é pequena.

A compressão fecha a maior parte da lacuna, já que as chaves repetidas são exatamente o que um compressor faz melhor, e um NDJSON compactado costuma ficar perto de um CSV compactado dos mesmos dados. Se o tamanho em repouso é o que importa de verdade, isso é um sinal para olhar Parquet em vez disso, onde os nomes das colunas ficam guardados uma vez só num rodapé.

O que ainda precisa acontecer antes de um job de carga aceitar

NDJSON é uma forma de contêiner, não um contrato. Um destino que ingere linhas JSON ainda vai ter opiniões sobre nomes de campo, formato de data e se um null é permitido numa posição — e nenhuma dessas opiniões é decidida por esta conversão.

As duas que mais pegam as pessoas são data e identificador. Uma data num CSV é texto e continua texto, então qualquer string que o sistema exportador escolheu é o que chega. Identificadores, como acima, podem ter virado números.

A exportação é interpretada nesta página, não num servidor

Ler o CSV e escrever as linhas JSON são ambos JavaScript puro, carregado por esta página sob demanda. Nenhuma requisição carrega o arquivo, então uma exportação de clientes noturna ou um extrato financeiro pode ser convertido sem virar cópia de mais ninguém.

O plano gratuito para em 100 MB por arquivo, e abaixo disso o teto é memória. A tabela inteira é montada antes de qualquer coisa ser escrita, o que coloca dezenas de megabytes confortavelmente no alcance e o último trecho até 100 MB no ponto em que uma aba do navegador começa a forçar.

Quando JSON, CSV ou Parquet é o destino melhor

Escolha um array JSON simples quando tudo vai ser carregado de uma vez por algo que espera um array — um payload de API, um fixture de teste, um arquivo de configuração. NDJSON é pior que inútil ali, porque a maioria dos interpretadores JSON vai rejeitar de cara na segunda linha.

Mantenha o CSV se o destino é uma planilha ou uma tela de importação que o nomeia. E escolha Parquet quando os mesmos dados forem consultados repetidamente em vez de ingeridos uma vez: guarda os nomes das colunas uma vez, mantém os tipos explicitamente em vez de por inferência, e é uma fração do tamanho em disco.

Como converter CSV para NDJSON

  1. Solte o seu arquivo CSV nesta página, ou clique para escolher um.
  2. Escolha NDJSON como destino. A conversão acontece no seu navegador e o arquivo não é enviado.
  3. Baixe o arquivo NDJSON pronto.

CSV ou NDJSON: o que muda

CSV comparado com NDJSON
CSVNDJSON
Nome completoComma-Separated ValuesNewline-Delimited JSON
Extensão do arquivo.csv.ndjson, .jsonl
Tipo de mídiatext/csvapplication/x-ndjson
Publicado pela primeira vez19722013
EspecificaçãoRFC 4180
LicençaPadrão abertoPadrão aberto
Situação hojeAtualAtual
Abre no navegadorNenhum navegadorNenhum navegador
Considerado no lugarXLSX, JSON, ParquetJSON

O que se mantém

Nada é descartado. CSV e NDJSON guardam o conteúdo sem perda, então a conversão troca a embalagem e não a qualidade — e pode ser repetida sem que o estrago se acumule.

Abrir o resultado

pandas lê tanto CSV quanto NDJSON, então dá para comparar o resultado com o original sem um segundo programa.

Para que serve cada formato

CSV foi publicado em 1972. Está descrito em RFC 4180, e vale conhecer se o arquivo precisa sobreviver à ferramenta que o escreveu.

NDJSON e de 2013. jq e pandas leem o formato.

CSV foi publicado em 1972 e NDJSON em 2013. O mais antigo costuma ser o arquivo mais seguro para entregar; o mais novo faz o mesmo com menos bytes.

De CSV para NDJSON: perguntas frequentes

Meu arquivo CSV é enviado para algum lugar?

Não. Esta conversão acontece inteiramente no seu navegador, então o arquivo não sai do seu aparelho. Você mesmo pode conferir: abra a aba de rede das ferramentas de desenvolvedor e converta alguma coisa. Você verá a própria página e as requisições de estatística e de publicidade com que este serviço é pago, e nenhuma que leve o seu arquivo.

Converter CSV para NDJSON é grátis?

É. Sem conta, sem marca d’água e sem cota diária para gastar: roda no seu próprio aparelho, então você pode voltar quantas vezes quiser. O navegador processa arquivos de até 100 MB, 100 por vez.

Perde qualidade ao converter CSV para NDJSON?

Não. NDJSON guarda o mesmo conteúdo sem jogar nada fora: o resultado é idêntico em qualidade ao original.

A conversão de CSV para NDJSON é sem perda?

Nada é descartado. CSV e NDJSON guardam o conteúdo sem perda, então a conversão troca a embalagem e não a qualidade — e pode ser repetida sem que o estrago se acumule.

Mais sobre esses formatos