Pular para o conteúdo

Por que o Excel estraga seu CSV

CEPs perdem o zero à esquerda, códigos de produto viram datas e identificadores longos são arredondados sem aviso. Acontece ao abrir, não ao salvar — e é por isso que tanta gente nunca descobre o que deu errado.

Última revisão:

O estrago acontece quando você abre o arquivo

É isso que torna o problema tão difícil de diagnosticar. Um CSV é um arquivo de texto: cada valor nele são caracteres, e nada no arquivo diz o que eles significam. Quando o Excel abre um CSV, ele adivinha um tipo para cada coluna, converte os valores de acordo e, a partir daí, guarda a versão convertida. Salve o arquivo e as conversões são gravadas nele.

Ou seja, o arquivo estava certo, o arquivo que você salvou não está, e em nenhum momento nada avisou você. As pessoas concluem que a exportação veio com defeito, exportam de novo e têm o mesmo resultado — porque a corrupção acontece no próprio computador delas, depois do download.

As quatro conversões que causam o estrago

Zeros à esquerda são removidos. Um CEP como 01234-000, um código de departamento francês, um número de conta, um telefone começando com zero — tudo parece número, então o zero é descartado como se não significasse nada. Ele significa; faz parte do identificador.

Números longos são arredondados. Uma planilha guarda números em ponto flutuante com cerca de quinze dígitos significativos, então um número de pedido, um número de cartão de crédito, um IMEI ou um identificador de 64 bits é arredondado sem aviso — os últimos dígitos viram zeros. A célula parece um número e é o número errado.

Tudo o que parece uma data é reformatado, seguindo a convenção local. 03/05 é março num país e maio em outro, então o mesmo arquivo aberto em dois escritórios gera dois conjuntos de dados diferentes. Pior: valores que nunca foram datas são convertidos. Um nome de gene como SEPT1 vira data, um problema tão persistente que os geneticistas acabaram renomeando os genes em vez de continuar brigando com ele.

Caracteres acentuados viram lixo (mojibake). Um CSV não registra sua codificação de caracteres, então um arquivo salvo em UTF-8 e lido como uma página de código antiga — ou o contrário — estraga justamente as linhas com nomes acentuados.

A solução: importe, não abra

Nunca dê dois cliques num CSV que importa para você. O clique duplo dá ao Excel permissão para adivinhar, e ele adivinha com toda a confiança.

Em vez disso, use Dados → De Texto/CSV. A janela de importação permite definir o tipo de cada coluna antes de qualquer interpretação — marque a coluna de CEP e a de identificador como Texto, e elas chegam exatamente como estão no arquivo. Ela também permite informar a codificação e o delimitador, em vez de deixá-los ser deduzidos. Leva vinte segundos e é a solução inteira.

O mesmo vale para o Google Planilhas: Arquivo → Importar, e desmarque “Converter texto em números, datas e fórmulas”. O LibreOffice Calc mostra a janela de tipos de coluna por padrão, uma das poucas áreas em que ele simplesmente se comporta melhor.

Inspecione antes de importar

Quando algo já deu errado, o primeiro passo útil é olhar o arquivo sem nenhuma planilha mexer nele. Visualizar o CSV mostra os valores exatamente como os bytes dizem — zeros à esquerda presentes, números longos completos, datas como o texto em que foram escritas. Isso mostra na hora se o erro estava na exportação ou na importação.

Também mostra as duas coisas que um CSV nunca informa sobre si mesmo: o delimitador — vírgula, ponto e vírgula ou tabulação; configurações regionais europeias exportam com ponto e vírgula porque nelas a vírgula é o separador decimal — e a codificação. Saber as duas antes de importar elimina a maior parte do resto da adivinhação.

Se é você quem gera o CSV

Algumas decisões na hora da exportação evitam tudo isso mais adiante.

Grave em UTF-8 com BOM (marca de ordem de bytes) se o arquivo vai ser aberto no Excel para Windows. O Excel usa essa marca para detectar UTF-8 e estraga os caracteres acentuados sem ela — um dos raros casos em que adicionar um BOM é a decisão certa, e não um incômodo.

Coloque entre aspas todo campo que possa ser mal interpretado, e sempre as colunas de identificadores. As aspas não impedem o Excel de converter ao abrir, mas deixam a intenção clara para qualquer outro programa que ler o arquivo.

Considere não usar CSV. Se quem recebe aceita JSON ou uma planilha de verdade, os dois carregam os tipos de forma explícita e não têm nenhuma dessas falhas. A virtude do CSV é que tudo o lê; a fraqueza é que nada concorda sobre o que ele diz.

Perguntas frequentes

Dá para desfazer o estrago depois de salvar?

Não de forma confiável. Um zero à esquerda removido e um dígito arredondado se perderam — não há nada no arquivo para recuperá-los. Exporte de novo a partir da fonte original; é por isso que vale a pena gastar espaço em disco guardando a exportação original intacta.

Por que meu CSV abre como uma única coluna comprida?

O delimitador não é o que a planilha espera — geralmente um arquivo com ponto e vírgula aberto numa configuração regional que usa vírgula, ou o contrário. A janela de importação permite informá-lo, o que é mais rápido do que mudar as configurações regionais do sistema.

Que caractere estranho é esse no começo do nome da minha primeira coluna?

Uma marca de ordem de bytes (BOM), lida como texto em vez de como indicação de codificação. É a mesma marca que corrige os acentos no Excel, e por isso ela é ao mesmo tempo útil e irritante — a maioria dos leitores de CSV bem feitos a remove automaticamente.

Existe um padrão de CSV?

Só uma especificação informativa de 2005 que descreve o que a maioria das ferramentas faz, e muito software que faz outra coisa. É por isso que delimitadores, aspas, quebras de linha e codificações variam — e por isso detectá-los, em vez de pressupô-los, é a única abordagem que funciona com arquivos reais.

Por que uma linha aparece quebrada em várias linhas no meu editor de texto?

Porque um campo entre aspas pode conter quebras de linha legitimamente — normalmente um campo de endereço. O registro continua sendo uma linha só; qualquer coisa que divida o arquivo nas quebras de linha vai corromper exatamente essas linhas, e é por isso que dividir por vírgulas ou quebras de linha é a forma errada de ler um CSV.