Я пытаюсь извлечь текст в соответствии с заголовками в полуструктурированном текстовом документе.
Ввод
Column<-"Order:1223442 Subject:History Name Bilbo Johnson Grade: Bad Report: Need to complete Conclusion: Dud"
Вывод здесь
Order Subject Name Grade Report Conclusion
1223442 History Bilbo Johnson Bad Need to complete Dud
Я могу добиться этого с помощью следующей (грязной, но работающей) функции:
dataframeIn<-data.frame(Column,stringsAsFactors=FALSE)
delim<-c("Order","Subject","Name","Grade","Report","Conclusion")
Extractor <- function(dataframeIn, Column, delim) {
dataframeInForLater<-dataframeIn
ColumnForLater<-Column
Column <- rlang::sym(Column)
dataframeIn <- data.frame(dataframeIn)
dataframeIn<-dataframeIn %>%
tidyr::separate(!!Column, into = c("added_name",delim),
sep = paste(delim, collapse = "|"),
extra = "drop", fill = "right")
names(dataframeIn) <- gsub(".", "", names(dataframeIn), fixed = TRUE)
dataframeIn<-data.frame(dataframeIn)
#Add the original column back in so have the original reference
dataframeIn<-cbind(dataframeInForLater[,ColumnForLater],dataframeIn)
dataframeIn<-data.frame(dataframeIn)
return(dataframeIn)
}
Extractor(dataframeIn, "Column", delim)
Однако иногда отсутствуют разделители, например
Order:1223442 Subject:History Name Bilbo Johnson Grade: Bad Conclusion: Dud
В этом случае желаемым выходным значением является
Order Subject Name Grade Conclusion
1223442 History Bilbo Johnson Bad Dud
, но фактическим выходным значением становится:
Order Subject Name Grade Report Conclusion
:1223442 :History Bilbo Johnson : Bad : Dud <NA>
Как можно учесть отсутствующие разделители, хотя они находятся в том же порядке (включаяразделители, которые отсутствуют в середине текста, а также в конце, как в примере выше)?