library("readxl") library("writexl") library("dplyr") library("xlsx") library("stringi") library("stringr") library("tictoc") library("rlang") #Funktionen & Konfiguration einbinden source("sparql.R") source("config/config.R") ### Einlesen ### inDB <- get_current_geoera_lit_db() to_replace_original <- read_excel(paste(PFAD_EXCEL, FILENAME_EXCEL, sep=""), sheet = SHEETNAME) to_replace_done <- to_replace_original #Erste Schleife über den Spaltenvektor aus der Excel for (spalte_excel in SPALTEN[1]:SPALTEN[length(SPALTEN)]) { #Start der Zeitmessung für aktuelle Spalte tic(paste("starte mit Spalte",spalte_excel)) #Zweite Schleife über die jeweiligen Zeilen des Spaltenvektors for (zeile_excel in 1:nrow(to_replace_original[, spalte_excel])) { #Current Excel ist das derzeit behandelte Zitate / Zelle current_excel <- tolower(to_replace_original[zeile_excel, spalte_excel]) #Falls die aktuelle Zelle leer ist wird die nächste Iteration begonnen um Rechenleistung zu sparen if (is.na(current_excel)) { next } #Falls der Inhalt der aktuellen Zelle zu kurz ist wird ebenfalls die nächste Iteration begonnen und der Inhalt gelöscht #der Grund dafür ist, dass es bei sehr wenigen Zeichen (<=THRESHOLD) sehr unwahrscheinlich ist, dass es ein gültiges Vollzitat ist if ((nchar(current_excel) <= THRESHOLD)) { to_replace_done[zeile_excel, spalte_excel] <- "" next } #Zerlegt den Zelleninhalt und macht daraus eine Liste "Wort"liste aus alphanumerischen Zeichen, getrennt wird jeweils bei nicht-alphanumischen Zeichen excel_search_all <- unlist(strsplit(gsub("[^[:alnum:] ]", "", current_excel), " +")) #Legt eine Liste aus Zahlen zwischen 1900 & 2099 an, die in der aktuellen Zelle sind. (soll das Jahr der Publizierung finden) #Grund hierfür ist, dass das Jahr ein sehr guter zusätzlicher Indikator ist ob eine Publikation gleich ist excel_search_numbers <- unlist(str_extract_all(current_excel, "(?:19|20)\\d{2}")) #Dritte Schleife die über die Vollzitatzeilen (INHALTE_DB) der Datenbank iteriert for (zeile_db in 1:nrow(inDB[, INHALTE_DB])) { #aktuell behandeltes Element der Datenbank current_db <- tolower(inDB[zeile_db,INHALTE_DB]) #Zerlegt den Zelleninhalt und macht daraus eine Liste "Wort"liste aus alphanumerischen Zeichen, getrennt wird jeweils bei nicht-alphanumischen Zeichen db_search_all <- unlist(strsplit(gsub("[^[:alnum:] ]", "", current_db), " +")) #Legt eine Liste aus Zahlen zwischen 1900 & 2099 an, die in der aktuellen Zelle sind. (soll das Jahr der Publizierung finden) db_search_numbers <- unlist(str_extract_all(current_db, "(?:19|20)\\d{2}")) #Initialiersierung der Countvariablen count_all <- 0 count_numbers <- 0 #Initialiersierung der Matchvariablen percent_match_all <- 0.01 percent_match_numbers <- 0.01 #Vierter(a) Schleifendurchlauf - Eruiert welche Elemente des Excel-Vektors im Datenbankvektors sind und zählt diese for (k in 1:length(excel_search_all)) { if (excel_search_all[k] %in% db_search_all) { count_all <- count_all + 1 } } #Vierter(b) Schleifendurchlauf - Eruiert welche Jahre des Excel-Vektors im Jahres-Datenbankvektors sind und zählt diese #Wird nur durchgeführt wenn beide Vektoren gefüllt sind if ((length(db_search_numbers) > 0) && (length(excel_search_numbers) > 0)) { for (l in 1:length(excel_search_numbers)) { if (excel_search_numbers[l] %in% db_search_numbers) { count_numbers <- count_numbers + 1 } } } #Rechnet aus (in %) wieviele der Wörter gefunden wurden percent_match_all <- count_all / length(excel_search_all) #Rechnet aus (in %) wieviele der Jahre gefunden wurden. Überprüfung ob der Excel-Jahresvektor leer ist, um Division durch 0 zu vermeiden if (length(excel_search_numbers) > 0) { percent_match_numbers <- count_numbers / length(excel_search_numbers) } #Wenn genug Übereinstimmung gefunden wird, wird das Zitat durch die URI aus der Datenbank ersetzt #Beim Jahr muss die Übereinstimmung höher sein, weil es ein sehr guter Indikator für die gleiche Publikation ist if ((percent_match_all >= MATCH_ALL) && (percent_match_numbers > MATCH_YEAR)) { to_replace_done[zeile_excel, spalte_excel] <- str_remove_all(inDB[zeile_db,ID], "[<>]") } } } #Ende der Laufzeitberechnung für die erste Schleife (gemacht um abschätzen zu können wie lange ein Durchgang dauert) toc() } #Schreibt die Exceldatei ins Outputverzeichnis pfad_output <- paste(PFAD_OUT, "replaced_", format(Sys.time(), "%Y_%m_%d_%H%M%S"), FILENAME_EXCEL, sep="") write_xlsx(to_replace_done, pfad_output)