mygems

Como ler o CSV de um extrato bancário

Linhas de preâmbulo, duas colunas de valor, datas ambíguas e tudo enfiado na descrição. Veja como fazer uma exportação do banco responder a uma pergunta.

Por uos ·

As exportações CSV dos bancos são hostis sempre do mesmo jeito, e conhecer a lista transforma um arquivo confuso num trabalho de cinco minutos. Cada um dos problemas abaixo é uma decisão de formatação do banco, não um dano no arquivo:

  • Linhas de preâmbulo. Nome da conta, código da agência (sort code), período e uma linha em branco antes do cabeçalho. Qualquer leitor que você apontar para o arquivo vai tratar a primeira dessas linhas como os nomes das colunas.
  • Duas colunas de valor, Debit e Credit, em vez de um único valor com sinal. Ou um valor com sinal em que a convenção é o oposto do que você espera.
  • Datas ambíguas. 03/04/2026 é 3 de abril no Reino Unido e 4 de março nos Estados Unidos, e o arquivo não diz qual.
  • Uma coluna de descrição com cinco campos de uma vez: estabelecimento, local, número do cartão, referência e o tipo de transação do próprio banco.
  • Valores como texto, com separadores de milhar, símbolos de moeda ou negativos escritos como (45.00).

Resolva esses cinco e o arquivo vira dado comum.

Primeiro, o formato do arquivo

Abra o arquivo e olhe as primeiras dez linhas antes de qualquer coisa:

head -n 12 statement.csv

Conte as linhas de preâmbulo e veja qual é o cabeçalho de verdade. Depois pule essas linhas:

tail -n +5 statement.csv > clean.csv

Se você for abrir numa planilha, apague essas linhas antes de fazer qualquer outra coisa. Ordenar ou filtrar com elas ainda lá coloca o resumo da conta no meio das suas transações, onde é difícil de notar e fácil de incluir num total.

As datas, a armadilha

Este é o erro que produz respostas erradas em vez de uma quebra óbvia. Um leitor no formato americano lendo um extrato britânico converte, sem avisar, 3 de abril em 4 de março em todos os dias até o dia doze, e deixa o resto como está. O resultado parece completamente normal e todos os totais mensais estão errados.

Duas formas de resolver, da mais confiável para a menos:

Ache um dia acima de 12. Percorra a coluna de datas procurando um valor como 25/12/2026. Se o primeiro componente passa de doze, o formato começa pelo dia. Leva dez segundos e é definitivo.

Compare com uma transação de que você se lembra. Qualquer coisa que você consiga datar de cabeça resolve a convenção na hora.

Depois converta de forma explícita, em vez de deixar algo adivinhar:

duckdb -c "SELECT strptime(\"Transaction Date\", '%d/%m/%Y') d, * FROM read_csv('clean.csv', all_varchar=true)"

all_varchar=true é a metade importante: ele impede o leitor de inferir tipos, então cada conversão é decisão sua. Isso também protege os números de referência e os dígitos da conta, que de outro modo chegariam como números decimais.

Normalize o valor

Você quer uma única coluna numérica com sinal, e há três formatos de origem.

Colunas Debit e Credit separadas. Combine, com os débitos negativos:

COALESCE(-TRY_CAST(replace("Debit", ',', '') AS DOUBLE), TRY_CAST(replace("Credit", ',', '') AS DOUBLE), 0)

Texto com separadores ou símbolos. Tire tudo que não seja dígito, sinal de menos ou ponto decimal antes de converter. £1,234.56 e 1 234,56 precisam disso, e o segundo ainda exige tratar a vírgula decimal.

Negativos contábeis. (45.00) significa −45,00. Nada converte isso corretamente por padrão; substitua os parênteses primeiro.

Depois verifique a conversão antes de confiar em qualquer total: o número de valores não nulos tem que ser igual ao número de linhas de transação. Um TRY_CAST que falha dá um NULL silencioso, e um NULL dentro de um SUM simplesmente não entra na conta, que é como um total acaba plausivelmente errado em vez de obviamente quebrado.

Divida a coluna de descrição

A informação útil está escondida na descrição, e ela chega como uma única string:

CARD PAYMENT TO TESCO STORES 3421 ON 02-04-2026 GBP 43.19

Raramente você precisa de um parser completo. Duas operações cobrem quase tudo que as pessoas querem:

Uma coluna de estabelecimento, comparando com uma lista de nomes que importam para você. Vinte cláusulas CASE WHEN description LIKE '%TESCO%' THEN 'Tesco' categorizam a grande maioria de um extrato pessoal, e a cauda longa não vale a pena automatizar.

Uma coluna de tipo de transação, a partir do prefixo. CARD PAYMENT, DIRECT DEBIT, FASTER PAYMENT, ATM. Os bancos são consistentes nisso dentro de uma mesma exportação, e agrupar por tipo costuma ser mais informativo do que agrupar por estabelecimento.

O que não tentar: extrair um valor ou uma data confiável de dentro da descrição. Os dois já são colunas, e as cópias embutidas no texto têm outra formatação e às vezes divergem.

Aí sim, a pergunta de verdade

Quando o arquivo tem uma data, um valor com sinal e um estabelecimento, cada pergunta cabe numa linha:

SELECT strftime(d, '%Y-%m') month, sum(amount) FROM tx GROUP BY month ORDER BY month
SELECT merchant, count(*) n, sum(amount) FROM tx WHERE amount < 0 GROUP BY merchant ORDER BY sum(amount) LIMIT 20
SELECT * FROM tx WHERE amount < -100 ORDER BY amount

Saldo líquido por mês, maiores gastos por estabelecimento, tudo acima de cem. Essas três respondem à maior parte do que alguém quer saber ao abrir um extrato.

CSV File Viewer - Smart CSViPhone e iPad · Android

O SQL e o editor visual de filtros rodam direto no arquivo, onde ele está, o que é o ponto quando se trata de uma exportação bancária que você prefere não enviar para lugar nenhum. Os gráficos saem da mesma consulta, então um total mensal vira um gráfico de barras no mesmo passo.

O que ele faz

Essa última consideração merece ser dita com clareza. Um extrato bancário está entre os arquivos mais sensíveis que a maioria das pessoas manipula: cada estabelecimento, cada local, cada pagamento recorrente e, muitas vezes, parte do número da conta. Visualizadores de CSV on-line gratuitos e sites de «converta seu extrato» enviam tudo para um servidor sobre o qual você não sabe nada. Para este arquivo em especial, uma ferramenta que funciona localmente não é frescura: é a escolha padrão óbvia.

Preparando para outra pessoa

Muitas vezes você abriu o extrato porque alguém precisa de uma parte dele: um contador, um proprietário, um pedido de reembolso. O trabalho é de subtração:

  1. Mantenha as colunas que importam: data, descrição, valor. Apague o resto, inclusive o saldo corrente e os dígitos da conta.
  2. Filtre pelo período ou pela categoria que realmente foi pedida.
  3. Adicione uma coluna de categoria se alguém for pedir uma.
  4. Exporte e confira se o total da exportação bate com o total do seu filtro.

Vale ocultar a coluna de saldo de propósito, em vez de deixá-la por preguiça, porque ela revela bem mais do que as próprias transações.

CSV Editor - Smart CSViPhone e iPad

Apagar colunas, filtrar por período e adicionar uma coluna de categoria calculada são edições diretas aqui, e as colunas de fórmula salvam os resultados no CSV, então o arquivo que você entrega é um CSV simples que abre corretamente no que quer que o destinatário use.

O que ele faz

Vários meses, várias contas

Os bancos exportam um período por vez, então qualquer pergunta que abranja um ano envolve vários arquivos. Duas coisas a fazer antes de combiná-los:

Confira se os cabeçalhos são iguais. Os bancos mudam o formato de exportação de um ano para outro, e uma coluna que mudou de posição desalinha tudo que vem depois se você concatenar às cegas. Compare primeiro as linhas de cabeçalho; o guia para mesclar arquivos CSV explica a mesclagem por nome de coluna, que resiste a isso.

Adicione uma coluna de conta antes de combinar arquivos de contas diferentes. Sem ela, uma transferência entre suas próprias contas aparece duas vezes, uma como saída e outra como entrada, e todo total que ignora isso erra pelo dobro da transferência. Marcar a origem e depois excluir explicitamente as transferências internas é a única forma de chegar a um total da casa que signifique alguma coisa.

Perguntas

Por que o CSV do meu extrato bancário abre com os cabeçalhos de coluna errados?
Porque a maioria dos bancos coloca linhas de preâmbulo acima do cabeçalho (nome da conta, código da agência, período, uma linha em branco) e todo leitor trata a primeira linha que vê como os nomes das colunas. Olhe as primeiras dez linhas, conte o preâmbulo e pule: `tail -n +5 statement.csv > clean.csv`, ou apague essas linhas antes de fazer qualquer outra coisa numa planilha.
Como sei se as datas estão em dia-mês ou mês-dia?
Procure na coluna de datas algum valor cujo primeiro componente seja maior que doze, como 25/12/2026, o que prova que o formato começa pelo dia. Isso importa mais do que parece: um leitor que espera o mês primeiro, ao ler um arquivo que começa pelo dia, converte em silêncio todas as datas até o dia doze e deixa o resto como está, então os totais ficam errados e nada parece quebrado.
Como combino as colunas Debit e Credit em um único valor?
Converta as duas em números depois de tirar separadores e símbolos de moeda, negue o débito e combine com COALESCE: `COALESCE(-TRY_CAST(replace(Debit, ',', '') AS DOUBLE), TRY_CAST(replace(Credit, ',', '') AS DOUBLE), 0)`. Depois confira se o número de valores não nulos é igual ao número de linhas. Uma conversão que falha vira NULL, e um NULL dentro de um SUM simplesmente é ignorado, o que gera um total errado em vez de um erro.
Como categorizo as transações de um CSV de banco?
Compare a descrição com uma lista de nomes de estabelecimentos que importam para você, usando uma série de cláusulas CASE WHEN; vinte delas categorizam a maior parte de um extrato pessoal, e a cauda longa não vale a pena automatizar. Agrupar pelo prefixo do tipo de transação (CARD PAYMENT, DIRECT DEBIT, ATM) costuma ser mais útil e não precisa de lista nenhuma.
É seguro abrir um extrato bancário num visualizador de CSV on-line?
Isso significa enviar cada estabelecimento, cada local e cada pagamento recorrente seu, e muitas vezes parte do número da conta, para um serviço sobre o qual você não sabe nada. Para este arquivo em especial, use algo que trabalhe no arquivo localmente, como uma planilha, uma ferramenta de linha de comando local ou um app que não envia nada, em vez de um conversor no navegador.
Como analiso vários meses de extratos juntos?
Confira se os cabeçalhos são iguais antes de combinar, já que os bancos mudam o formato de exportação de um ano para outro e uma coluna que se moveu desalinha tudo se você concatenar às cegas. Antes, adicione uma coluna que identifique a conta. Sem ela, uma transferência entre suas próprias contas aparece como saída e como entrada, e qualquer total que não exclua as transferências internas erra pelo dobro do valor.

uos — Criador do CSV Editor e do Smart CSV Viewer, e ainda não encontrou dois bancos que exportem um extrato do mesmo jeito.