library("readxl") library("writexl") library("dplyr") library("xlsx") library("stringi") library("stringr") library("tidyverse") #Konfiguration einbinden source("config/config.R") source("functions.R") #Datenbank einlesen und doppelte entfernen inDB <- data.frame(get_current_geoera_lit_db()$citation) inDB <- unique(inDB) #Spaltenname setzen colnames(inDB) <- (c(COLUMN_NAME)) #Excel mit den Zitaten die hinzugefügt werden sollen einlesen neu_df <- data.frame(read_excel(paste(PFAD_EXCEL, "distincts_kontrolliert.xlsx", sep=""))) neu_df <- data.frame(lapply(neu_df, stri_enc_toutf8)) #die beiden Dataframes zusammenfügen (braucht gleiche Spaltennamen) all_df <- rbind(inDB, neu_df) all_df_2 <- unique(all_df) #inner_join finds common elements between two data frames #anti_join finds elements the are exclusively in one of the data frames #Gemeinsame Element finden common <- inner_join(neu_df, inDB) #Finde die Element die noch nicht in der Datenbank sind not_in_db <- anti_join(neu_df, common) #### TO DO #### # Die direkte Vergleichsfunktion durch die %-Match-Funktion aus 03 ersetzen. # Ist etwas heikler, sollte aber weiterhin ganz gut funktionieren. # Gehört komplett ausprogrammiert und getest. not_in_db_2 <- c() #Erste Schleife über die Zeilen der Einträge die nicht in der Datenbank sind for (zeile_excel in 1:nrow(not_in_db)) { #Current Excel ist das derzeit behandelte Zitate / Zelle current_excel <- str_squish(not_in_db[zeile_excel, 1]) #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)) { 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}")) #Zweite Schleife die über die Vollzitatzeilen der Datenbank iteriert for (zeile_db in 1:nrow(inDB)) { #aktuell behandeltes Element der Datenbank #current_db <- tolower(inDB[zeile_db, 1]) current_db <- str_squish(inDB[zeile_db, 1]) #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 #Dritter(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 } } #Dritter(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, 1] <- str_remove_all(inDB[zeile_db,ID], "[<>]") not_in_db_2 <- c(not_in_db_2, current_excel) } } } #muss in einen Data-Frame umgewandelt werden um write_xlsx zu verwenden not_in_db_2 <- data.frame(not_in_db_2) not_in_db_2 <- unique(not_in_db_2) colnames(not_in_db_2) <- (c(COLUMN_NAME)) #Die der Uniques in eine Datei schreiben write_xlsx(not_in_db_2, paste(PFAD_OUT, "not_in_db_",format(Sys.time(), "%Y_%m_%d") ,".xlsx", sep=""))