Last active
September 5, 2023 04:40
-
-
Save joaociocca/7aed9021db12729e4393ecd4a998c5dc to your computer and use it in GitHub Desktop.
código em R para transformar o PDF horrível do C6 em um CSV com data, descrição e valor.
This file contains 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
# Verifique se foram fornecidos argumentos pela linha de comando | |
if (length(commandArgs(trailingOnly = TRUE)) < 1) { | |
cat("Uso: Rscript extrato_C6_PDF-CSV.r <arquivo_PDF>\n") | |
quit(status = 1) | |
} | |
# Obtenha o nome do arquivo PDF e a senha dos argumentos | |
arquivo_pdf <- commandArgs(trailingOnly = TRUE)[1] | |
# password <- commandArgs(trailingOnly = TRUE)[2] | |
# Você também pode ocultar a senha ao solicitá-la | |
senha <- readline("Digite a senha (será ocultada, deixe em branco se não houver): ", "") | |
# Instalar e carregar o pacote pdftools | |
if (!require(pdftools)) { | |
install.packages("pdftools") | |
} | |
library(pdftools) | |
# Definir o caminho do arquivo PDF e a senha | |
# arquivo_pdf <- "extrato.pdf" | |
# senha <- "senha_do_arquivo" | |
# Ler o PDF com a senha especificada, se fornecida | |
if (length(senha) > 0) { | |
pdf_texto <- pdf_text(arquivo_pdf, upw = senha) | |
} else { | |
pdf_texto <- pdf_text(arquivo_pdf) | |
} | |
# Inicializar variáveis para armazenar os dados do extrato | |
dados_extrato <- list() | |
# Definir o número de linhas de cabeçalho para cada página | |
linhas_de_cabecalho <- c(19) # Padrão para a primeira página | |
linhas_de_rodape <- 9 # Padrão para linhas de rodapé | |
# Inicializar um vetor para armazenar os dados de todas as páginas | |
todos_os_dados <- character(0) | |
# Loop pelas páginas do pdf_texto | |
for (i in seq_along(pdf_texto)) { | |
# Extrair o texto da página atual | |
texto_pagina <- pdf_texto[[i]] | |
# Dividir o texto da página em linhas | |
linhas_pagina <- unlist(strsplit(texto_pagina, "\n")) | |
# Calcular o número de linhas de cabeçalho para esta página | |
linhas_de_cabecalho_atual <- linhas_de_cabecalho[1] # Padrão para a primeira página | |
if (i > 1) { | |
linhas_de_cabecalho_atual <- 13 # Ajustar para outras páginas | |
} | |
# Remover as linhas de cabeçalho e rodapé | |
dados_pagina <- linhas_pagina[(linhas_de_cabecalho_atual + 1):(length(linhas_pagina) - linhas_de_rodape)] | |
# Anexar os dados extraídos desta página a todos_os_dados | |
todos_os_dados <- c(todos_os_dados, dados_pagina) | |
} | |
# Filtrar linhas que não terminem com "C" ou "D" | |
dados_filtrados <- todos_os_dados[grep("[CD]$", todos_os_dados)] | |
# Inicializar vetores para armazenar cada campo | |
datas <- character(0) | |
descricoes <- character(0) | |
numeros_de_documento <- character(0) | |
valores <- numeric(0) | |
cd <- character(0) | |
# Loop por cada linha dos dados filtrados | |
for (linha in dados_filtrados) { | |
# Extrair data (dd/mm/yyyy) | |
data <- sub("^(\\d{2}/\\d{2}/\\d{4}).*", "\\1", linha) | |
# Extrair descrição | |
descricao <- sub("^\\d{2}/\\d{2}/\\d{4}\\s+(.*?)\\s+\\d{12}.*", "\\1", linha) | |
# Extrair número do documento (12 dígitos) | |
numero_de_documento <- sub(".*?(\\d{12}).*", "\\1", linha) | |
# Extrair valor (1.234,00) e converter para numérico | |
valor_str <- sub(".*?(\\d{1,3}(\\.\\d{3})*(,\\d{2})).*", "\\1", linha) | |
# Remover pontos para milhares | |
valor_str <- gsub("\\.", "", valor_str) | |
# Substituir vírgula por ponto para torná-lo um formato numérico válido (1.234,00) | |
valor_str <- gsub(",", ".", valor_str) | |
# Tentar converter para numérico, lidando com caracteres não numéricos potenciais | |
valor_numerico <- as.numeric(valor_str) | |
if (is.na(valor_numerico)) { | |
valor_numerico <- NA # Definir como NA se a conversão falhar | |
} | |
# Determinar C ou D | |
indicador_cd <- sub(".*([CD])$", "\\1", linha) | |
# Anexar os valores extraídos aos respectivos vetores | |
datas <- c(datas, data) | |
descricoes <- c(descricoes, descricao) | |
numeros_de_documento <- c(numeros_de_documento, numero_de_documento) | |
valores <- c(valores, valor_numerico) | |
cd <- c(cd, indicador_cd) | |
} | |
# Criar um quadro de dados a partir dos campos extraídos | |
extrato_bancario <- data.frame(Data = datas, Descrição = descricoes, | |
Número_do_Documento = numeros_de_documento, Valor = valores, CD = cd) | |
# Definir uma função para converter valores com base em CD | |
converter_valor <- function(valor, cd) { | |
if (length(valor) > 0 && length(cd) > 0) { | |
if (cd == "D") { | |
return(-as.numeric(as.character(valor))) | |
} else { | |
return(as.numeric(as.character(valor))) | |
} | |
} else { | |
return(as.numeric(as.character(valor))) | |
} | |
} | |
# Aplicar a função converter_valor à coluna Valor | |
extrato_bancario$Valor <- mapply(converter_valor, extrato_bancario$Valor, extrato_bancario$CD) | |
# Remover as colunas Número_do_Documento e CD | |
extrato_bancario <- extrato_bancario[, -which(names(extrato_bancario) %in% c("Número_do_Documento", "CD"))] | |
# Remover strings específicas da coluna Descrição | |
extrato_bancario$Descrição <- gsub("DEBITO DE CARTAO -|DEB AUTOMATICO -", "", extrato_bancario$Descrição) | |
# Remover espaço em branco no final da coluna Descrição | |
extrato_bancario$Descrição <- gsub("\\s+BRA$", "", extrato_bancario$Descrição) | |
extrato_bancario$Descrição <- gsub("\\s+BRASILIA$", "", extrato_bancario$Descrição) | |
# Salvar o quadro de dados como um arquivo CSV sem nomes de linhas | |
write.csv(extrato_bancario, file = "extrato_bancario.csv", row.names = FALSE) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment