Last active
May 26, 2025 01:32
-
-
Save fabiolimace/43f6a48af5d9e034f4f07cf22d551dc7 to your computer and use it in GitHub Desktop.
Ferramentas para detectar entradas de fatura e expandir parcelas de cartão de crédito da CAIXA para importação no GnuCash
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/mawk -f | |
| # | |
| # Transforma um extrato exportado da Caixa no formato TXT para uma arquivo mais simples. | |
| # | |
| # O arquivo exportado eh na verdade um CSV com um ponto e vírgula separando colunas. | |
| # | |
| # O arquivo de saida gerado por este script eh um TSV com data e valor reformatados. | |
| # | |
| # Aceita entradas de extrato neste formato (4 colunas): | |
| # | |
| # "Conta";"Data_Mov";"Nr_Doc";"Historico";"Valor";"Deb_Cred" | |
| # "0146912880007618094030";"20250322";"000000";"REM BASICA";"0.01";"C" | |
| # | |
| # Transforma cada entrada processada em uma lista de entradas neste formato: | |
| # | |
| # Data_Mov Nr_Doc Historico Valor | |
| # 2025-03-22 000000 REM BASICA 0.01 | |
| # | |
| # Colunas esperadas na entrada e produzidas na saída: | |
| # 1. A data no formato AAAA-DD-MM; | |
| # 2. O número da transação, que pode estar no formato DDHHMM (dia, hora, minuto); | |
| # 3. A descrição da transação, num formato padronizado pela Caixa; | |
| # 4. O valor da transação, com um ponto separando os centavos, sendo negativo se for débito. | |
| # | |
| # A lista de entradas gerada poderá ser importada para o GnuCash. | |
| # | |
| # Modo de usar: | |
| # | |
| # ./gnucash-caixa-conta-transformar-extrato-txt.awk extrato.txt > extrato.tsv | |
| # | |
| function error(msg) { | |
| print msg; exit 1; | |
| } | |
| function formatar_valor(valor, sinal) { | |
| if (valor !~ padrao_valor || sinal !~ padrao_sinal) error("Valor invalido: " valor " " sinal); | |
| sub(/\./, ",", valor); | |
| return (sinal == "D" ? "-" : "") valor; | |
| } | |
| function formatar_data(data) { | |
| if (data !~ padrao_data) error("Data invalida: " data); | |
| return substr(data, 1, 4) "-" substr(data, 5, 2) "-" substr(data, 7, 2); | |
| } | |
| BEGIN { | |
| FS=";" | |
| OFS="\t" | |
| padrao_sinal="^[CD]$"; | |
| padrao_data="^.{8}$"; | |
| padrao_valor="^[0-9]+[.][0-9]{2}$"; | |
| } | |
| { | |
| gsub("\"", ""); | |
| } | |
| $4 ~ /SALDO DIA/ { | |
| next; | |
| } | |
| NF == 6 { | |
| if (NR == 1) { | |
| $1 = $2; | |
| $2 = $3; | |
| $3 = $4; | |
| $4 = $5; | |
| $5 = null; | |
| $6 = null; | |
| print; | |
| next; | |
| } | |
| $1 = formatar_data($2); | |
| $2 = $3; | |
| $3 = $4; | |
| $4 = formatar_valor($5, $6); | |
| $5 = null; | |
| $6 = null; | |
| print; | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/mawk -f | |
| # | |
| # Detecta as colunas das entradas de extrato de cartão de crédito da CAIXA. | |
| # | |
| # Útil para extrair as entradas de extrato das faturas no formato de arquivo PDF, pois ao se copiar e colar as entradas de arquivos PDF, as divisões em colunas se perdem. | |
| # | |
| # No visualizador de PDF do Firefox, as colunas são separadas por espaços. Já no visualizador de PDF do Gnome, as colunas não são separadas por nada. | |
| # | |
| # Aceita linhas neste formato (com espaços simples entre as colunas): | |
| # | |
| # 07/02 AJUSTE CREDITO PARC. LOJISTAA 0,04C | |
| # 25/01 NETFLIX.COM SAO PAULO 44,90D | |
| # | |
| # Ou neste formato (sem espaço nenhum entre as colunas): | |
| # | |
| # 07/02AJUSTE CREDITO PARC. LOJISTAA0,04C | |
| # 25/01NETFLIX.COM SAO PAULO44,90D | |
| # | |
| # Transforma cada entrada processada nisto (4 colunas separadas por tabulação): | |
| # | |
| # 07/02 AJUSTE CREDITO PARC. LOJISTAA 0,04 | |
| # 25/01 NETFLIX.COM SAO PAULO 44,90 | |
| # | |
| # Colunas esperadas pela entrada: | |
| # 1. A data no formato DD/MM, detectado no início da linha; | |
| # 2. A descrição, sendo um texto qualquer entre as colunas detectadas 1 e 3; | |
| # 3. O valor a ser creditado ou debitado, acompanhado da letra C (crédito) ou D (débito), detectado no final da linha; | |
| # | |
| # NOTA: A especificação acima das colunas esperadas é baseada no texto extraído das faturas de cartão de crédito em formato PDF. | |
| # | |
| # Colunas produzidas pela saída: | |
| # 1. A data no formato DD/MM; | |
| # 2. A descrição, podendo conter o número da parcela no formato XX YY ou XX DE YY; | |
| # 3. O valor a ser creditado, que diminui a dívida com o cartão de crédito; | |
| # 4. O valor a ser debitado, que aumenta a dívida com o cartão de crédito. | |
| # | |
| # NOTA: A especificação acima das colunas produzidas é baseada no texto extraído das faturas de cartão de crédito em formato HTML, visualizadas no site do internet banking da CAIXA. | |
| # | |
| # O nome do local pode ser removido com a ajuda do parametro CIDADES, que é uma lista de nomes de cidades separados por vírgula. O conteúdo padrão do parâmetro é este: BARUERI,CURITIBA,FORTALEZA,FRANCA,MARANGUAPE,OSASCO,RIO DE JANEIRO,SAO PAULO. As localidades que restarem no texto da descrição podem ser excluídas manualmente. | |
| # | |
| # A lista de entradas gerada poderá ser importada para o GnuCash. | |
| # | |
| # Modo de usar: | |
| # | |
| # # usar o script para detectar colunas | |
| # ./gnucash-caixa-visa-detectar-colunas.awk arquivo.txt | |
| # | |
| # # usar o script para detectar colunas em conjunto com o script que expande as parcelas | |
| # ./gnucash-caixa-visa-detectar-colunas.awk arquivo.txt | ./gnucash-caixa-visa-expandir-parcelas.awk | |
| # | |
| # NOTA: este script pressupõe `LANG=pt_BR.UTF-8`. | |
| # | |
| BEGIN { | |
| FS="\t" | |
| OFS="\t" | |
| if (!CIDADES) { | |
| CIDADES="BARUERI,CURITIBA,FORTALEZA,FRANCA,MARANGUAPE,OSASCO,RIO DE JANEIRO,SAO PAULO"; | |
| } | |
| } | |
| /^[0-9]{2}\/[0-9]{2}[ ]?/ && /[ ]?([0-9]+\.)?[0-9]+,[0-9]{2}[DC]$/ { | |
| # Acrescentar 3 colunas: Data, Descrição e Crédito. | |
| sub(/^[0-9]{2}\/[0-9]{2}[ ]?/, "&\t"); | |
| sub(/[ ]?([0-9]+\.)?[0-9]+,[0-9]{2}[DC]$/, "\t&"); | |
| # Mover os débitos para a 4a coluna: Débito. | |
| if ($NF ~ /D$/ ) { | |
| $NF = "\t" $NF; | |
| } | |
| # Remover espacos dos valores. | |
| sub(/[ ]+/, "", $1); | |
| sub(/[ ]+/, "", $NF); | |
| # Remover C e D dos valores. | |
| sub(/[CD]$/, "", $NF); | |
| } | |
| CIDADES { | |
| CIDADES=toupper(CIDADES); | |
| split(CIDADES, cidades, ","); | |
| for (i in cidades) { | |
| # Remove a cidade da descricao | |
| cidades[i] = substr(cidades[i], 1, 12); | |
| posicao = index(toupper($2), cidades[i]); | |
| if (posicao) { $2 = substr($2, 1, posicao-1); }; | |
| } | |
| } | |
| { | |
| print $0; | |
| } | |
| END { | |
| } | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/mawk -f | |
| # | |
| # Expande as parcelas de entradas de extrato de cartão de crédito da CAIXA. | |
| # | |
| # Aceita entradas de extrato neste formato (4 colunas): | |
| # | |
| # 05/11 AMAZON 01 05 52,50 | |
| # | |
| # Ou neste formato (4 colunas e com a preposição DE na descrição): | |
| # | |
| # 05/11 AMAZON 01 DE 05 52,50 | |
| # | |
| # Transforma cada entrada processada em uma lista de entradas neste formato: | |
| # | |
| # 05/11 05/11/2024 - AMAZON - 5 x 52,50 262,50 | |
| # 05/11 05/11/2024 - AMAZON - 01 de 05 52,50 | |
| # 05/12 05/11/2024 - AMAZON - 02 de 05 52,50 | |
| # 05/01 05/11/2024 - AMAZON - 03 de 05 52,50 | |
| # 05/02 05/11/2024 - AMAZON - 04 de 05 52,50 | |
| # 05/03 05/11/2024 - AMAZON - 05 de 05 52,50 | |
| # | |
| # NOTA: apenas os parcelamentos que estiverem na primeira parcela serao expandidos, para evitar gerar entradas duplicadas no GnuCash. | |
| # | |
| # Colunas esperadas na entrada e produzidas na saída: | |
| # 1. A data no formato DD/MM; | |
| # 2. A descrição, podendo conter o número da parcela no formato XX YY ou XX DE YY; | |
| # 3. O valor a ser creditado, que diminui a dívida com o cartão de crédito; | |
| # 4. O valor a ser debitado, que aumenta a dívida com o cartão de crédito. | |
| # | |
| # NOTA: A especificação acima das colunas esperadas e produzidas é baseada no texto extraído das faturas de cartão de crédito em formato HTML, visualizadas no site do internet banking da CAIXA. | |
| # | |
| # A lista de entradas gerada poderá ser importada para o GnuCash. | |
| # | |
| # Modo de usar: | |
| # | |
| # ./gnucash-caixa-visa-expandir-parcelas.awk arquivo.txt | |
| # | |
| # NOTA: este script pressupõe `LANG=pt_BR.UTF-8`. | |
| # | |
| function completar_data(dia, mes) { | |
| ano = strftime("%Y"); | |
| hoje = systime(); | |
| data = mktime(ano " " mes " " dia " 00 00 00"); | |
| if (data > hoje) { | |
| ano = ano - 1; # a compra foi no ano passado | |
| data = mktime(ano " " mes " " dia " 00 00 00"); | |
| } | |
| return strftime("%d/%m/%Y", data); | |
| } | |
| function normalizar_espacos() { | |
| for (i = 1; i <= NF; i++) { | |
| sub(/^[ ]+/,"",$i); # sobrando na esquerda | |
| sub(/[ ]+$/,"",$i); # sobrando na direita | |
| gsub(/[ ]+/," ",$i); # duplicados no meio | |
| } | |
| } | |
| BEGIN { | |
| FS="\t" | |
| OFS="\t" | |
| padrao_data="^[0-9]{2}\/[0-9]{2}$"; | |
| padrao_valor="^([0-9]+[.,])?[0-9]+[,.][0-9]{2}$"; | |
| padrao_parcelamento="[ ][0-9]{2} (DE )?[0-9]{2}$"; | |
| } | |
| { | |
| gsub(/[*]/, " ", $2); | |
| normalizar_espacos(); | |
| } | |
| NF == 4 && $1 ~ padrao_data && $2 ~ padrao_parcelamento && $4 ~ padrao_valor { | |
| dia = substr($1, 1, 2); | |
| mes = substr($1, 4, 2); | |
| data = completar_data(dia, mes); | |
| texto = $2; | |
| valor = $4; | |
| parcelamento=substr($2, match($2, padrao_parcelamento)); | |
| parcela = substr(parcelamento, 2, 3) + 0; | |
| vezes = substr(parcelamento, length(parcelamento)-2) + 0; | |
| sub(/\./, "", valor); # remover separador de milhar | |
| sub(parcelamento, "", texto); # remover trecho do parcelamento | |
| normalizar_espacos(); | |
| if (parcela == 1) { | |
| printf ("\n%02d/%02d\t%s - %s - %d x %0.2f\t%0.2f\t\n", dia, mes, data, texto, vezes, valor, vezes * valor); | |
| for (i = 1; i <= vezes; i++) { | |
| if (i > 1 && dia > 28) dia = 28; | |
| if (i > 1) mes = ((mes + 1) % 12); | |
| if (mes == 0) mes = 12; | |
| printf ("%02d/%02d\t%s - %s - %02d de %02d\t\t%0.2f\n", dia, mes, data, texto, i, vezes, valor); | |
| } | |
| next; | |
| } | |
| } | |
| { | |
| print "" | |
| print $0; | |
| } | |
| END { | |
| } | |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Teste de
gnucash-caixa-visa-detectar-colunas.awkConteudo do
arquivo.txt:Detectar as colunas no arquivo.txt usando o script:
Note que SAO PAULO foi removido da descrição, por ser uma das cidades listadas por padrao no parametro
CIDADES.Teste de
gnucash-caixa-visa-expandir-parcelas.awkConteudo do
arquivo.txt:Expandir as parcelas no
arquivo.txtusando o script: