library(stringr)
prep.odk.towiki <- function(odkform.file=odkform.file,odkexport.file=odkexport.file, colldata= "colldata",dataformat="%b %d, %Y") {
#le os arquivos especificados
dad = read.table(odkexport.file,header=T,as.is=T,sep=",")
formulario = scan(odkform.file,what="character",sep="\n")
if (length(formulario)==0 | nrow(dad)==0) {
stop("Dados ou formulario nao especificados corretamente")
}
#converte coluna de data de coleta se houver
if ("colldata"%in%colnames(dad)) {
oloc = Sys.getlocale("LC_TIME")
Sys.setlocale("LC_TIME", "C")
adt = as.Date(dad[,colldata],dataformat )
dad[,colldata] = adt
Sys.setlocale("LC_TIME", oloc)
}
#trabalha apenas colunas que nao sao da exportacao pelo ODK aggregate
colsel =c("SubmissionDate","SET.OF.imagens","meta.instanceID","meta.instanceName","KEY")
ascols = colnames(dad)
colsfica = ascols[!ascols%in%colsel]
#para cada coluna restante pegas os labels e atualiza a planilha
for(d in 1:length(colsfica)) {
#coluna a ser trabalhada
cf = colsfica[d]
#para cada linha
for(r in 1:length(dad[,cf])) {
print(paste(d,r))
#valor da celula
cl = dad[r,cf]
#elimina NA se houver
cl = cl[!is.na(cl)]
#se ainda assim tem valor e nao for numero, corrige
if (length(cl)==1 & !is.numeric(cl) & !class(cl)=="Date") {
#pega os valores (que estao separados por espaco, se houve mais de um num 'select')
osvalores = strsplit(cl,split=" ")[[1]]
#cria um objeto vazio
osvalnovos = NULL
#para cada valor procura no formulario o LABEL correspondente
#que está no formato reconhecido pelo wiki (infelizmente o odk aggregate briefcase nao da opcao de ajustar isso)
for(os in 1:length(osvalores)) {
#limpa espacos antes e depois do valor
oval = str_trim(osvalores[os])
oval = gsub("\\(","",oval)
oval = gsub("\\)","",oval)
#novo valor
lab = NA
if (length(oval)==1) {
#procura o que em form
oque = paste("",oval,"","",formulario[gp1-1])
lab = gsub("","",lab)
lab = str_trim(lab)
} else {
gp3 = grep("","",lab)
lab = str_trim(lab)
}
}
}
}
#se achou um valor novo, adiciona ao vetor
if (!is.na(lab)) {
osvalnovos = c(osvalnovos,lab)
}
#sai do loop
}
osvalnovos = osvalnovos[!is.na(osvalnovos)]
#se mudou algo, adiciona
if (length(osvalnovos)>0) {
ostxt = paste(osvalnovos,collapse = ";")
dad[r,cf] = ostxt
}
}
}
}
return(dad)
}