-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathauto_dict.R
More file actions
137 lines (99 loc) · 2.82 KB
/
auto_dict.R
File metadata and controls
137 lines (99 loc) · 2.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
library(magrittr)
library(stringr)
# Script para construir automaticamente dicionários da PNADC
# Lê dicionários de SAS em formato .txt
# COnverte em .dct do Stata
# Componentes:
# 1. Posição
# 2. Data type do Stata
# 3. Nome da variável
# 4. Comprimento, %2f
# 5. Descrição
# basta rodar a função auto_dict com as opções
# original: caminho até o dicionário original em .txt, ou até link para o site
# output: caminho para salvar o produto final, com .dct
# eng: TRUE/FALSE determinando se vai traduzir ou não
# api_key: caso queira traduzir, chave de API do DeepL
auto_dict <- function(original, output, eng, api_key = "") {
# Lendo o dicionário
dct <- readLines(original, encoding = "latin1", warn = FALSE)
# Removendo linhas estranhas
# mantendo apenas o que começa com @
# onde tem variáveis
dct <- dct[str_detect(dct, "@.*")]
# iniciando a conversão de SAS para Stata
# primeiro separo a descrição das variáveis do resto
# separador é /*
dct <- dct %>%
str_split(fixed("/*"), simplify = TRUE)
# salvo a descrição em um vetor
desc <- dct[, 2] %>%
str_remove(fixed("*/")) %>%
str_trim()
# resto do dicionario
dct <- dct[, 1]
# agora separo as outras colunas com base em espaços
dct <- dct %>%
str_split(" ", simplify = TRUE)
# removo colunas vazias
dct <- dct[, colSums(dct != "") > 0]
# coluna de posicao
# @1234 -> _column(1234)
position <- dct[, 1] %>%
str_replace("@(\\d+)", "_column(\\1)")
# nomes das variáveis
names <- dct[, 2]
# comprimento
length_num <- dct[, 3] %>%
str_extract("\\d+") %>%
as.numeric()
length <- length_num %>%
sprintf("%%%sf", .)
# agora os data types
types <- dplyr::case_when(
length_num <= 2 ~ "byte",
length_num <= 4 ~ "int",
length_num <= 9 ~ "long",
.default = "float"
)
# opcional: tradução para inglês
if (eng) {
deeplr::usage2(auth_key = api_key)
desc <- purrr::map(
# Splitting the data into batches of 10 rows
split(desc, ceiling(seq_along(desc) / 5)),
function(x) {
res <- deeplr::translate2(
text = x,
source_lang = "PT",
target_lang = "EN",
auth_key = api_key
)
cat("Time for a break!\n")
Sys.sleep(10)
return(res)
}
) %>%
unlist()
}
# acrescento aspas
desc <- sprintf("`\"%s\"'", desc)
# montando o dicionário
dct <- paste(
position, types, names, length, desc,
sep = "\t"
)
# header e footer
dct <- c(
"dictionary{",
dct,
"}"
)
# salvando
writeLines(dct, output)
}
# salvando (corrigindo acentos)
# con <- file(output, open = "w", encoding = "UTF-8")
# writeLines(dct, con)
# close(con)
# }