Skip to content

Instantly share code, notes, and snippets.

@joaociocca
Last active September 5, 2023 04:40
Show Gist options
  • Save joaociocca/7aed9021db12729e4393ecd4a998c5dc to your computer and use it in GitHub Desktop.
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.
# 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