library(tidyverse)
library(fs)

Obtém nome do arquivo de teste

fname <- dir_ls("data",regexp = "MP_EMPENHOS_\\d{6}.TXT")
fname
## data/MP_EMPENHOS_201401.TXT

Verifica encoding

guess_encoding(fname)

Localização Brasil

locale_bra <- locale(encoding="ISO-8859-1",
                     decimal_mark = ",",
                     date_format="%d/%m/%Y")

Analiza cabeçalho / nome das colunas

first_line <- read_lines(fname,n_max=1,locale=locale_bra) %>%
  str_split(fixed(";")) %>%
  first
first_line
##  [1] "Poder"             "Grupo"             "Modalidade"       
##  [4] "Elemento"          "NomeElemento"      "SubElemento"      
##  [7] "NomeSubElemento"   "Orgao"             "NomeOrgao"        
## [10] "UO"                "NomeUO"            "UG"               
## [13] "NomeUG"            "Credor"            "NomeCredor"       
## [16] "FonteRecursos"     "NomeFonteRecursos" "Processo"         
## [19] "Funcao"            "NomeFuncao"        "SubFuncao"        
## [22] "NomeSubFuncao"     "Programa"          "NomePrograma"     
## [25] "Acao"              "NomeAcao"          "Licitacao"        
## [28] "Data"              "TipoAto"           "Valor"            
## [31] "Exercicio"         "EmpenhoExercicio"  "Liquidacao"       
## [34] "Pagamento"         "Historico"         "Banco"            
## [37] "NomeBanco"         "Agencia"           "ContaCorrente"    
## [40] "NomeContaCorrente" "ASPS"              "MDE"              
## [43] "ExercicioContrato" "NumeroContrato"    "ObjetoContrato"   
## [46] ""

Numa named-list, especifica quais colunas quer ler e seus tipos:

desired_columns <- list(
   Data=col_date()      # Data=col_date(format="%d/%m/%Y"), default em locale_bra
  ,Poder=col_factor()   # Poder="f"
  ,Funcao=col_integer() # Funcao="i"
  ,Valor=col_double()   # Valor="d"
)

Verifica indices do cabeçalho

which(first_line %in% names(desired_columns))
## [1]  1 19 28 30

Lê primeiras 10 linhas, só com colunas/tipos especificados em desired_columns. Note que do.call(), “injeta” desired_columns como parâmetros de cols_only().

read_delim(
  fname,
  n_max=10,
  delim=fixed(";"),
  trim_ws = T,
  locale=locale_bra,
  col_types = do.call(cols_only,desired_columns)
  # alternative to do.call(): purrr::exec() + splice list (!!!)
  # col_types = exec(cols_only, !!!desired_columns)
)