Comparar dois arquivos CSV e ver o que mudou

A maneira mais rápida de comparar dois arquivos CSV é colar ambos em uma ferramenta de diff lado a lado, alinhar as colunas e ler as linhas que ela destaca. A comparação é a parte fácil. O ruído é o que complica para as pessoas: uma exportação reordenada, um ponto e vírgula em vez de uma vírgula ou um valor que alguém colocou entre aspas podem fazer dois arquivos que contêm os mesmos dados parecerem não ter nada em comum.

Este guia mostra como obter um diff de CSV limpo e confiável. Vamos ver por que duas exportações equivalentes se afastam no papel, quais métodos vale a pena conhecer e um exemplo prático que você pode acompanhar. Se você só quer a ferramenta, nossa página de comparação de CSV faz isso no navegador.

Por que arquivos CSV são enganosamente difíceis de comparar

O CSV parece simples, mas não tem um único padrão rígido. O mais próximo disso é o RFC 4180, e muitos arquivos do mundo real não o seguem. Duas exportações da mesma tabela podem diferir em delimitador, aspas, finais de linha e ordem das linhas enquanto descrevem exatamente os mesmos dados. Um diff de texto simples não sabe disso, então sinaliza tudo.

Aqui está o ponto-chave a decidir antes de começar: a ordem das linhas importa para você? Uma exportação de banco de dados ordenada por nome e a mesma exportação ordenada por ID contêm o conjunto idêntico de registros, mas um diff de linhas vai pintar quase todas as linhas de vermelho e verde. Se as linhas têm uma chave estável (uma coluna de ID), ordenar ambos os arquivos por essa chave primeiro transforma o diff de volta em algo legível.

Parece uma mudança, mas geralmente não é
O que você vê no diffÉ uma mudança real?O que fazer
Linhas em ordem diferenteNão, se os dados são o mesmo conjuntoOrdenar ambos os arquivos por uma coluna-chave
Delimitador vírgula vs. ponto e vírgulaNão, mesmos camposNormalizar para um delimitador
Ada vs. "Ada"Não, as aspas são opcionais aquiNormalizar as aspas
Finais de linha CRLF vs. LFNãoNormalizar os finais de linha
Uma linha vazia no finalNãoRemover
O valor de uma célula mudouSimInvestigar, isso é real

A linha do delimitador pega muita gente, especialmente entre regiões: muitas configurações regionais europeias usam ponto e vírgula porque a vírgula é o separador decimal. Mesmos dados, separador diferente. Se você quer o detalhe de como navegadores e ferramentas leem texto tabular, a nota da MDN sobre leitura de arquivos no navegador é um bom ponto de partida.

Quatro maneiras de comparar CSV e quando usar cada uma

Não existe um único método melhor. Depende do tamanho dos arquivos e de se a ordem das linhas importa. Veja como as opções comuns se comparam.

MétodoMelhor paraEsforçoEntende CSV?
Olhar a olho nuArquivos minúsculos, poucas linhasBaixoNão, você é o parser
Ferramenta de diff onlineVerificações rápidas, colar de qualquer lugarBaixoLinha por linha, sim
Aplicativo de planilhaRevisão visual, fórmulas, filtragemMédioSim, mas manual
Linha de comando (sort, csvkit)Arquivos grandes, scripting, comparações por chaveMédioSim, quando você ordena primeiro

Para a maioria das pessoas, uma ferramenta de navegador vence na velocidade: nada para instalar, e você pode colar uma exportação direto de um download ou de um cliente de banco de dados. O porém é o ruído de ordem das linhas e de delimitador, que tratamos a seguir. Para arquivos muito grandes, vale a pena aprender o csvkit na linha de comando.

A comparação limpa mais rápida, passo a passo

Esta é a rotina que uso quando alguém me entrega duas exportações e pergunta "o que mudou?". Leva menos de um minuto.

  1. Garanta que ambos os arquivos usem o mesmo delimitador e tenham a mesma linha de cabeçalho.
  2. Se a ordem das linhas não importa, ordene ambos os arquivos por uma coluna-chave primeiro.
  3. Abra a ferramenta de comparação de CSV.
  4. Cole o original à esquerda e a nova versão à direita.
  5. Leia o resultado. Verde é uma linha adicionada, vermelho é uma linha removida, e uma célula alterada aparece como uma de cada.

O passo dois é todo o truque quando as linhas estão desordenadas. Uma vez que ambos os arquivos estão ordenados da mesma forma, a única coisa que resta a destacar são as linhas que realmente mudaram. Nosso motor de diff é construído sobre o diff-match-patch do Google, que compara linha por linha primeiro, então permanece rápido mesmo em arquivos longos.

Um exemplo prático

Digamos que você esteja revisando uma mudança numa tabela de usuários. Aqui está o antes:

id,name,role,seats
7,Ada Lovelace,editor,3
8,Alan Turing,viewer,1

E aqui está o depois, exportado em uma ordem de linhas diferente:

id,name,role,seats
8,Alan Turing,viewer,1
7,Ada Lovelace,admin,5

Jogue isso em um diff de linhas bruto e ambas as linhas de dados parecem alteradas, porque trocaram de posição. Ordene as duas pela coluna id, e a história real é curta:

O que realmente mudou
Linha (por id)ColunaAntesDepoisMudança
7roleeditoradminModificado
7seats35Modificado
8Sem mudança (apenas movido)

Uma edição real: a função e a contagem de assentos de Ada mudaram. A linha de Alan apenas se moveu. Essa promoção de editor para admin é exatamente o tipo de coisa que você quer pegar na revisão, e é fácil de perder quando está enterrada sob linhas que o diff sinalizou erroneamente como alteradas.

Eliminando o ruído de ordem das linhas na linha de comando

Se seus arquivos já estão no disco e as linhas não têm ordem inerente, a mesma ideia de "ordenar primeiro" funciona com dois comandos curtos. Mantenha o cabeçalho no lugar e ordene o resto:

(head -1 old.csv; tail -n +2 old.csv | sort) > old.sorted.csv
(head -1 new.csv; tail -n +2 new.csv | sort) > new.sorted.csv
diff old.sorted.csv new.sorted.csv

Agora o diff só reporta as linhas que realmente mudaram, porque ambos os arquivos estão na mesma ordem. Para comparações por chave que também ignoram a ordem das colunas, o csvsort e o csvjoin do csvkit dão mais controle. Este é o equivalente no terminal a ordenar os dois lados antes de comparar no navegador.

Delimitadores, aspas e a realidade bagunçada

Arquivos CSV reais quebram as regras o tempo todo. Um campo que contém uma vírgula precisa estar entre aspas, então "Lovelace, Ada" é um campo, não dois. Aspas dentro de um campo entre aspas são duplicadas: "Ela disse ""oi""". E o próprio separador varia: planilhas em configurações regionais com vírgula decimal exportam com ponto e vírgula, e arquivos separados por tabulação (TSV) são comuns em pipelines de dados. Antes de comparar, garanta que ambos os arquivos usem o mesmo delimitador e a mesma convenção de aspas, ou normalize-os com um parser que siga o RFC 4180. Caso contrário, o diff está comparando dois dialetos diferentes, não duas versões dos mesmos dados.

Armadilhas comuns para ficar de olho

ArmadilhaPor que ela mordeSolução
Delimitadores incompatíveisVírgula vs. ponto e vírgula faz cada campo parecer diferenteNormalizar para um delimitador primeiro
BOM no inícioUma marca de ordem de bytes oculta altera a primeira célula do cabeçalhoRemover o BOM antes de comparar
IDs com zeros à esquerdaUma planilha pode ter transformado 007 em 7Manter colunas de ID como texto; comparar como strings
Quebras de linha embutidasUm campo entre aspas pode conter uma quebra de linha, deslocando cada linha seguinteUsar um parser de CSV de verdade, não uma divisão por linhas
Espaços no final das célulasEspaços invisíveis aparecem como uma mudançaAparar os valores das células antes de comparar

Quando uma planilha é a melhor ferramenta

Um diff de texto é perfeito para identificar quais linhas mudaram e revisar a mudança como dados. Mas se você precisa filtrar, dinamizar ou comparar por fórmula em milhares de linhas, uma planilha encaixa melhor: importe os dois arquivos, alinhe-os por chave e use uma pesquisa para sinalizar divergências. As duas abordagens se complementam. Use o diff para uma leitura visual rápida e a planilha quando precisar fatiar os dados. Para as regras do formato subjacente de qualquer forma, a visão geral de CSV da Wikipedia é uma referência sólida.

Ferramentas relacionadas

CSV raramente é o único formato com que você lida. Se os mesmos dados também vivem como JSON, a comparação de JSON aplica a mesma ideia. Remover duplicatas de uma coluna de valores é rápido com remover linhas duplicadas, e colocar as linhas em uma ordem previsível antes de um diff é exatamente para isso que serve ordenar linhas.

Perguntas frequentes

Comparar arquivos CSV online os envia para algum lugar?
No comparetext.org o diff roda no seu navegador. Os dois arquivos CSV são comparados por JavaScript na sua própria máquina, então nada é enviado a um servidor a menos que você clique explicitamente em Salvar ou Compartilhar. Isso o torna seguro para exportações de clientes, dados financeiros e outras planilhas que você não gostaria de colar em um site que faz upload a cada tecla.
Por que meus dois arquivos CSV mostram cada linha como diferente?
Quase sempre é a ordem das linhas ou o delimitador, não mudanças reais. Uma exportação está ordenada de forma diferente da outra, ou uma usa vírgulas e a outra ponto e vírgula, ou os finais de linha diferem. Garanta que ambos os arquivos usem o mesmo delimitador, depois ordene os dois por uma coluna-chave para que a ordem deixe de importar. Depois disso, o diff geralmente encolhe para o punhado de linhas e células que genuinamente mudaram.
Como comparo dois arquivos CSV ignorando a ordem das linhas?
Ordene ambos os arquivos por uma coluna-chave estável antes de comparar. Se as linhas têm um ID, ordene por ele; caso contrário, ordene a linha inteira. Mantenha a linha de cabeçalho no lugar e ordene apenas as linhas de dados. No navegador você pode colar as versões ordenadas; na linha de comando, ordene o arquivo depois do cabeçalho. Uma vez que ambos os arquivos estão na mesma ordem, só aparecem no diff as linhas que realmente mudaram, em vez de cada linha que simplesmente se moveu.
Por que meu CSV usa ponto e vírgula em vez de vírgulas?
Muitas configurações regionais europeias usam a vírgula como separador decimal, então aplicativos de planilha exportam CSV com um delimitador de ponto e vírgula para evitar ambiguidade. Os dados são os mesmos; só o separador difere. Antes de comparar dois arquivos, garanta que usem o mesmo delimitador, ou você verá cada campo sinalizado como alterado. Normalizar ambos para vírgulas (ou ambos para ponto e vírgula) com uma ferramenta que entende CSV resolve. Arquivos separados por tabulação têm o mesmo problema com um separador diferente.
Como comparo arquivos CSV com ordens de colunas diferentes?
Um diff de texto simples compara as linhas da esquerda para a direita, então colunas reordenadas parecem uma mudança total mesmo quando os dados combinam. Para lidar com isso, reordene as colunas para combinarem em ambos os arquivos primeiro, ou use uma ferramenta que entende CSV e compara pelo nome do cabeçalho em vez da posição. Ferramentas de linha de comando como o csvkit podem selecionar e reordenar colunas por nome. Uma vez que as colunas se alinham na mesma ordem, um diff normal linha por linha volta a funcionar.
Posso comparar arquivos CSV grandes sem a página travar?
Sim, até certo ponto. Um diff em modo de linha permanece rápido em arquivos com milhares de linhas porque compara linhas inteiras primeiro em vez de cada caractere. Arquivos muito grandes (dezenas de megabytes ou milhões de linhas) são melhor tratados com uma ferramenta de linha de comando como o csvkit ou uma importação de banco de dados, que transmitem os dados. Para uma exportação pela qual você consegue rolar confortavelmente no navegador, um diff online é a opção mais rápida.

Pronto para experimentar? Cole seus arquivos na ferramenta de comparação de CSV e veja o que mudou.