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("","",formulario[gp1+1]) lab = gsub("","",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) }