User:RailML Coord Documentation/c roboterseiten konsolidierend.R
< User:RailML Coord Documentation(Redirected from User:Documentation/c roboterseiten konsolidierend.R)
Jump to navigation
Jump to search
# R-Skript zur Erstellung einer Dummyseite zum Import in Mediawiki #Starten unter Linux: In der Konsole: R CMD BATCH c_roboterseiten.R #kennt zwei Modi: #Modus hand: Die Seiten werden für die Vorlage "docBase" im normalen Namensraum vorbereitet #Modus dump: Die Seiten werden für die Vorlage "Schemaexport" im Benutzernamensraum von "Rotbot" vorbereitet#Kennt zwei Modi: modus<-0#Für Handmodus — Braucht nie auskommentiert zu werden, da man es überschreiben kann modus<-1#Für Dumpmodus #Name der Importdatei import<-"../exportmatrix/beispiel3d"#Für Dummytabelle #import<-"../exportmatrix/vorlage_echt"#Für echte Beispiele import<-"../exportmatrix/output"#für xsd-output #Name der Ergebnisdatei datei<-"../wikiimporte/dump2wiki.xml" if(modus==0){datei<-"../wikiimporte/fürs_wiki.xml"} #Bibliotheken library(stringr) library(tidyr) #Umbrüche für die Importdatei bruch<-"<br>" #Funktion, die leere Vektorenden abschneidet rip<-function(ripper){ rap<-c("") dim(rap)<-1 for(i in 1:dim(ripper)[2]){if(ripper[i]!=""){ rap[i]<-ripper[i] dim(rap)<-i }} dime<-dim(rap) rap<-unlist(rap) dim(rap)<-dime rap } #Funktion, die den Kinderbaustein vorbereitet #Wird auch erzeugt, wenn es keine Kinder gibt #Listet die Einträge als [[Wikilinks]] und trennt sie mit Beistrich #Eltern durchlaufen gleiche Funktion kids<-function(kinput){ kinput<-array(unlist(kinput)) dimk<-dim(kinput) kiba<-c("") if(kinput[1]==""){kiba<-"None"}else{kiba<-paste0("[[",kinput[1],"]]")} if(dimk>1){ for(i in 2:dimk){if(kinput[i]!=""){kiba<-paste0(kiba,", [[",kinput[i],"]]")}} } kiba } #Funktion, die Bausteine aus Attributen und ihren Kommentaren erzeugt azeile<-function(at,ak,ap){ at<-array(unlist(at)) ak<-array(unlist(ak)) ap<-array(unlist(ap)) dima<-dim(at) dimk<-dim(ak) dimp<-dim(ap) aba<-c("") if(at[1]==""){aba<-"None"}else{ komm<-"" if(1<=dimk){if(ak[1]!=""){komm<-paste0(" (",ak[1],")")}} aba<-paste0(at[1],komm) } if(dima>1){ for(i in 2:dima){ if(at[i]!=""){ komm<-"" if(i<=dimk){if(ak[i]!=""){komm<-paste0(" (",ak[i],")")}} aba<-paste0(aba,bruch,at[i],komm) }#if at nicht "" }#for }#if dima>1 aba }#function #Funktion, die Listenzeilen in Wikiseiten wandelt #Modusabhängig seite<-function(lijn){ #Modusabhängige Variablen für den Namensraum und Vorlage raum<-"" vorlage<-"docBase" if(modus==1){ raum<-"user:Robot/" vorlage<-"Schemaexport" } zeile<-c(1:7) zeile[1]<-"<page>\n" zeile[2]<-paste0("<title>",raum,lijn[1,1],"</title>\n") zeile[3]<-"<revision>\n" zeile[4]<-"<contributor><username>Robot</username></contributor>\n" zeile[5]<-"<text>\n" zeile[6]<-paste0("<noinclude>Automatic Schemaexport for Element '''",lijn[1,1],"'''</noinclude>\n") zeile[7]<-paste0("{{",vorlage,"\n") zeile[8]<-paste0("|element=",lijn[1,1],"\n") zeile[9]<-paste0("|comment=",lijn[1,2],"\n") zeile[10]<-paste0("|subschema=",lijn[1,3],"\n") zeile[11]<-paste0("|parent=",lijn[1,4],"\n") zeile[12]<-paste0("|children=",lijn[1,5],"\n") zeile[13]<-paste0("|attributes=",lijn[1,6],"\n") zeile[14]<-paste0("|obligatory=",lijn[1,8],"}}\n") #if(as.character(lijn[1,8])=="1"){zeile[14]<-paste0("|pflichtelement=Das Element ist verpflichtend}}\n")}else{zeile[14]<-paste0("|pflichtelement=Das Element ist nicht verpflichtend}}\n")} zeile[15]<-paste0("</text>\n") zeile[16]<-"</revision>\n" zeile[17]<-"</page>\n" #Bereinigung für den Handmodus: Entfernung des Vorlagenkommentars; Hinweis zum Substituieren if(modus==0){zeile[6]<-paste0("<!-- \nThis page has been created automatically, employing a template. Please, expand the template before editing the page: replace “",vorlage,"” by “subst:",vorlage,"”.!\nAfter expanding template ",vorlage,", please delete this comment. -->")} seite<-paste(zeile,collapse="") seite } #Prozedur, die die mehrelementigen Spalten aufbricht teilung<-function(spalte){ spalte<-t(t(unlist(spalte))) colnames(spalte)<-"kopf" spalte<-separate(as.data.frame(spalte),kopf,into=as.character(c(1:(1+(max(str_count(spalte,";")))))),sep=";",fill="right") #<NA> rausputzen: spalte[is.na(spalte)]<-"" spalte } # Hauptprogramm # Import liste <- read.table(import, sep="\t", header=TRUE, dec=",",stringsAsFactors=FALSE) #liste<-as.data.frame(liste) #kinder<-read.table("../zwischenergebnisse/kinder", sep=";", header=F, dec=",",fill=T,blank.lines.skip=F) #attribut<-read.table("../zwischenergebnisse/attribute", sep=";", header=F, dec=",",fill=T,blank.lines.skip=F) #akomment<-read.table("../zwischenergebnisse/attributkomment", sep=";", header=F, dec=",",fill=T,blank.lines.skip=F) #Elemente kritischer Spalten zu Character erklärt liste[is.na(liste)]<-"" #for(i in 1..dim(liste)[1]){if(is.na(liste$Pflichtelemente[i])=TRUE){liste$Pflichtelemente[i]=0}} #liste$Pflichtelemente[is.na(liste$Pflichtelemente)]<-0 liste$Parent<-as.character(liste$Parent) liste$Children<-as.character(liste$Children) liste$Attribute<-as.character(liste$Attribute) liste$Attributkommentare<-as.character(liste$Attributkommentare) liste$Subschema<-as.character(liste$Subschema) liste$Pflichtattribute<-as.character(liste$Pflichtattribute) #Die Spalten werden in die vorgesehene Reihenfolge gebracht #tasche<-liste #colnames(feld)<-c("Name","Kommentar","Subschema","Parent","Children","Attribute","Attributkommentare","Pflichtelement","Pflichtattribute") #liste[,1]<-tasche$Name #liste[,2]<-tasche$Kommentar #liste[,3]<-tasche$Subschema #liste[,4]<-tasche$Parent #liste[,5]<-tasche$Children #liste[,6]<-tasche$Attribute #liste[,7]<-tasche$Attributkommentare #liste[,8]<-tasche$Pflichtelement #liste[,9]<-tasche$Pflichtattribute #Die Spalten werden herausgehoben und bekommen formhalber einen benannten Kopf eltern<-teilung(liste$Parent) kinder<-teilung(liste$Children) attribut<-teilung(liste$Attribute) akomment<-teilung(liste$Attributkommentare) schema<-teilung(liste$Subschema) apflicht<-teilung(liste$Pflichtattribute) #Reinigung der Pflichtelementspalte #for(i in 1:dim(liste)[1]){if(liste$Pflichtelement[i]!=1){liste$Pflichtelement[i]<-0} #Hier werden die Subschemata, Eltern, Kinder, Attribute und Attributkommentare wieder mit der Liste konsolidiert — die Liste wird dreidimensional #for(i in 1:dim(kinder)[1]){liste[i,5]<-kids(kinder[i,],dim(kinder)[2])} #Subschemata: kik<-t(t(1:dim(liste)[1])) for(i in 1:dim(schema)[2]){schema[,i]<-as.character(schema[,i])} for(i in 1:dim(schema)[1]){kik[i,1]<-kids(schema[i,])} liste[,3]<-kik #Eltern: kik<-t(t(1:dim(liste)[1])) for(i in 1:dim(eltern)[2]){eltern[,i]<-as.character(eltern[,i])} for(i in 1:dim(eltern)[1]){kik[i,1]<-kids(eltern[i,])} liste[,4]<-kik #Kinder: kik<-t(t(1:dim(liste)[1])) for(i in 1:dim(kinder)[2]){kinder[,i]<-as.character(kinder[,i])} for(i in 1:dim(kinder)[1]){kik[i,1]<-kids(kinder[i,])} liste[,5]<-kik #Attribute: kik<-t(t(1:dim(liste)[1])) for(i in 1:dim(attribut)[2]){attribut[,i]<-as.character(attribut[,i])} for(i in 1:dim(akomment)[2]){akomment[,i]<-as.character(akomment[,i])} for(i in 1:dim(attribut)[1]){kik[i,1]<-azeile(attribut[i,],akomment[i,],apflicht[i,])} liste[,6]<-kik #Konsolidierung gleichlautender Elemente: #Hier wird die Tabelle nach den Elementnamen geordnet, damit gleichlautende Elemente nebeneinander stehen liste<-liste[order(liste$Name),] einzig<-unique(liste$Name)#Liste der Elementnamen kik<-liste[1:length(einzig),]#Transferliste mit Zeile je Element for(i in 1:length(einzig)){ kik$Name[i]<-einzig[i] kik$Kommentar[i]<-paste(unique(liste$Kommentar[liste$Name==einzig[i]]),collapse=";") kik$Subschema[i]<-paste(unique(liste$Subschema[liste$Name==einzig[i]]),collapse=";") kik$Parent[i]<-paste(unique(liste$Parent[liste$Name==einzig[i]]),collapse=";") kik$Children[i]<-paste(unique(liste$Children[liste$Name==einzig[i]]),collapse=";") kik$Attribute[i]<-paste(unique(liste$Attribute[liste$Name==einzig[i]]),collapse=";") kik$Attributkommentare[i]<-paste(unique(liste$Attributkommentare[liste$Name==einzig[i]]),collapse=";") kik$Pflichtelemente[i]<-paste(unique(liste$Pflichtelemente[liste$Name==einzig[i]]),collapse=";") kik$Pflichtattribute[i]<-paste(unique(liste$Pflichtattribute[liste$Name==einzig[i]]),collapse=";") } liste<-kik #Name↹Kommentar↹Subschema↹Parent↹Children↹Attribute↹Attributkommentare↹Pflichtelement↹Pflichtattribute #Hier werden die Zeilen der Importtabelle abgearbeitet lang<-dim(liste)[1] stran<-c(1:lang) for(i in 1:lang){ stran[i]<-seite(liste[i,1:8]) } stran<-paste(stran,collapse="") #Letzten Vektor vorbereiten fertig<-c("<mediawiki>\n",stran,"</mediawiki>") fertig<-paste(fertig,collapse="") # speichern fileConn<-file(datei) writeLines(fertig,fileConn) close(fileConn)