Unir as bases

# Defina o diretório onde estão os arquivos DBC e o código da doença desejada
pasta_sinan <- "D:/bd_dbc/DBC_SINAN/"
cod_doenca <- "BOTU" # Exemplo: "DENG", "HEPA", "CHIK"
anos <- 14:23 # Anos que serão lidos (2014 a 2023)
lista_sinan <- list() # Criação da lista para armazenar os dataframes lidos                                            

# Loop para leitura dinâmica dos arquivos .dbc
for (ano in anos) {
  arquivo <- paste0(pasta_sinan, cod_doenca, "BR", ano, ".dbc")  # Montagem do caminho completo do arquivo DBC  
  if (file.exists(arquivo)) {                                                                 # Verifica se o arquivo existe antes de tentar ler                
    tryCatch({                                                                                    # Lê o arquivo .dbc e armazena na lista com um nome baseado no ano
      lista_sinan[[paste0(tolower(cod_doenca), ano, "br")]] <- read.dbc::read.dbc(arquivo)
      message(paste0("✔︎ Arquivo '", basename(arquivo), "' lido com sucesso."))
    }, error = function(e) {
      message("✗ Erro ao ler o arquivo: ", basename(arquivo), " - ", e$message)  # Em caso de erro de leitura, exibe mensagem
    })
  } else {
    message("✗ Arquivo não encontrado: ", basename(arquivo))      # Caso o arquivo não exista, exibe mensagem de aviso
  }
}

# Exibe os nomes dos dataframes carregados
message("\nNomes dos dataframes carregados na lista 'lista_sinan':")   # Para checar se todos os bancos foram incluídos corretamente
print(names(lista_sinan))

# Se nenhum arquivo foi carregado, interrompe a execução com erro
if (length(lista_sinan) == 0) {
  stop("Nenhum arquivo DBC foi lido com sucesso. Verifique o caminho, nomes dos arquivos e o código da doença.")
}

# Coleta todas as colunas existentes nos dataframes lidos
todas_colunas <- unique(unlist(lapply(lista_sinan, colnames)))

# Função para padronizar colunas em todos os dataframes
padronizar_colunas <- function(df, todas_colunas) {
  colunas_faltantes <- setdiff(todas_colunas, colnames(df))
  df[colunas_faltantes] <- NA # Adiciona colunas faltantes com NA
  return(df[todas_colunas])   # Reordena as colunas na ordem padrão
}

# Padroniza colunas em todos os dataframes
message("\nPadronizando colunas dos dataframes para garantir compatibilidade...")
lista_sinan <- lapply(lista_sinan, padronizar_colunas, todas_colunas = todas_colunas)
message("✔︎ Colunas padronizadas para todos os dataframes.")

# Verifica se ainda há diferenças nas colunas após a padronização
message("\nVerificando diferenças nas colunas após padronização (deve ser vazia se tudo ok):")
diferencas_colunas <- lapply(lista_sinan, function(df) {
  setdiff(todas_colunas, colnames(df))
})
print(diferencas_colunas)

# Combina todos os dataframes em um único dataframe
message("\nCombinando dataframes em um único dataframe unificado...")
sinan_final_df <- do.call(rbind, lista_sinan)
message("✔︎ Dataframes combinados com sucesso.")

# Remove colunas que estão totalmente vazias (só NA)
message("Removendo colunas totalmente vazias do dataframe unificado...")
sinan_final_df <- sinan_final_df[, colSums(!is.na(sinan_final_df)) > 0]
message("✔︎ Colunas vazias removidas.")

# Exibe os nomes das colunas do dataframe final
message("\nNomes das colunas no dataframe final 'sinan_final_df':")
print(colnames(sinan_final_df))

# Define o caminho do arquivo Feather de saída
caminho_saida_feather <- paste0(
    "D:/bd_feather/",
    tolower(cod_doenca),
    min(anos), "br", max(anos),
    ".feather"
  )

# Salva o dataframe no formato Feather
message(paste0("\nSalvando dataframe combinado em formato Feather em '", caminho_saida_feather, "'..."))
write_feather(sinan_final_df, caminho_saida_feather, compression = "zstd")
message(paste0("✔︎ Arquivo '", basename(caminho_saida_feather), "' salvo com sucesso."))

# Verifica se o arquivo Feather foi salvo corretamente, tentando reabrir
message(paste0("\nVerificando o arquivo Feather recém-salvo: Carregando '", basename(caminho_saida_feather), "' para teste..."))
sinan_verificacao <- read_feather(caminho_saida_feather)
message(paste0("✔︎ Base '", basename(caminho_saida_feather), "' carregada para verificação."))
message(paste0("Dimensões da base carregada: ", nrow(sinan_verificacao), " linhas, ", ncol(sinan_verificacao), " colunas."))

HealthieR Scripts: Automatizando análises em Epidemiologia e Saúde Pública com R