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)
)