mehrere .xml-Dateien mit gleicher Struktur einlesen

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
sunshine_privat

mehrere .xml-Dateien mit gleicher Struktur einlesen

Beitrag von sunshine_privat »

Hallo zusammen,

ich habe ca. 2500 .xml-Dateien, die alle die gleiche Struktur haben (gesetzliche Vorgaben zur Struktur, Annahme nur, wenn Struktur stimmt) in einem Ordner und möchte nur ganz wenige Felder aus jeder Datei (z.B. Namen, später Spalten) auslesen, sodass ich am Ende eine Tabelle mit ca. 2500 Zeilen und ca. 10 Spalten habe. Ist das mit R irgendwie möglich? Die Daten einer einzelnen Datei konnte ich auslesen (allerdings je Feld mit separatem Befehl ...). Kann mir jemand helfen? Ich weiß, dass es gehen muss, weil es im Internet Anwendungsdatenbanken mit genaus den selben Dateien gibt ("maschinenverwertbare Dateien"), die alle Daten in Suchportalen bereitstellen. Diejenigen konvertieren bestimmt nicht 2500 Dateien manuell in .csv oder so.

Viele Grüße
Benutzeravatar
student
Beiträge: 674
Registriert: Fr Okt 07, 2016 9:52 am

Re: mehrere .xml-Dateien mit gleicher Struktur einlesen

Beitrag von student »

Hallo sunshine,

versuch es mal über die Funktion list.files um die Datei-Bezeichnung einzulesen und über eine Schleife um den Inhalt auszulesen.
Hier ein paar Fragmente:

Code: Alles auswählen

# Dateien einlesen:			
Dateien <- list.files(pattern="...")

# Datei festlegen:
	Start <- 1
	Ende <- Anzahl_Dateien
	for (i in Start:Ende) {
	
		# Dateien öffnen zum Lesen und einzeln Zuordnen:
		Datei <- file(Dateien[i], "r")
		
		while(Halt == FALSE){	# Durchlaufen, solange EOF nicht erreicht ist
		
			Zeile <- readLines(Datei, n = 1)	# Lese nur eine Zeile ein
						
	...
Viele Grüße,
Student
-----------------------------------------------------------------------------------------------------------------------
faes.de, Datenanalyse mit R & das Ad-Oculos-Projekt
Das Ad-Oculos-Projekt auf YouTube

Habe Mut, dich deines eigenen Verstandes zu bedienen! (Kant)
sunshine_privat

Re: mehrere .xml-Dateien mit gleicher Struktur einlesen

Beitrag von sunshine_privat »

Hallo student,

danke für Deine Antwort.
Ich habe mal einen Ordner mit 16 der Dateien gemacht und mit der von Dir vorgeschlagenen Eingabe eine Liste erzeugt:

Code: Alles auswählen

Dateien <- list.files("H:/R/GQB")
>Dateien
 [1] "260100023-01-2015-xml.xml" "260100023-99-2015-xml.xml" "260100034-00-2015-xml.xml"
 [4] "260100089-00-2015-xml.xml" "260100125-02-2015-xml.xml" "260100147-00-2015-xml.xml"
 [7] "260100170-01-2015-xml.xml" "260100170-99-2015-xml.xml" "260100238-00-2015-xml.xml"
[10] "260100272-00-2015-xml.xml" "260100318-00-2015-xml.xml" "260100329-00-2015-xml.xml"
[13] "260100432-01-2015-xml.xml" "260100432-02-2015-xml.xml" "260100432-03-2015-xml.xml"
[16] "260100432-99-2015-xml.xml"
Allerdings bin ich mir nicht sicher, ob die Dateien mit diesen Schritten "geparst" werden.

Dann wollte ich Deinen Vorschlag weiterverfolgen, aber ich habs nicht hingekriegt, weil Fehlermeldung (bin halt ein Neuling in R ;-), brauche aber die Auswertung für meine Abschlussarbeit)

Code: Alles auswählen

> Start <- 1
> Ende <- 16
> for (i in Start:Ende) {Datei <- file(Dateien[i], "r") while(Halt == FALSE){
Fehler: Unerwartete(s) 'while' in "for (i in Start:Ende) {Datei <- file(Dateien[i], "r") while"
Als nächstes hast Du mir einen Vorschlag gezeigt, wie man nur die erste Zeile einliest, aber in den .xml gibt es ja keine feste Zeilennummer für die Feldzuordnungen... wie kann ich dann die Felder ansprechen? Und wie kommt das Ganze dann in eine Tabelle?
Wenn das Ganze nicht .xml wäre, gibt es viele Anleitungen im Internet und in Büchern, aber für .xml steht irgendwie nirgends was brauchbares, das ich verstehe ...

Ich hab Dir unten mal Beispieldaten zusammengestellt.

Viele Grüße
sunshine

Code: Alles auswählen

> #Hier ein Beispiel mit den Benutzten Paketen, Arbeitsverzeichnis, Einlesen, Parsen und Auslesen von 3 Feldern (später Spalten: IK, Standortnummer, Art) aus 3 der xml-Dateien, wobei jede IK-Nummer (später Zeilen) einer separaten Datei entspricht)
> library("XML")
> library("plyr")
> getwd()
[1] "H:/R"
> setwd("H:/R")
> xmlfile=xmlParse("H:/R/GQB/260100023-01-2015-xml.xml")
> xmltop = xmlRoot(xmlfile)
> xmltop[['Krankenhaus']][['Kontaktdaten']][['IK']]
<IK>260100023</IK> 
> xmltop[['Krankenhaus']][['Kontaktdaten']][['Standortnummer']]
<Standortnummer>99</Standortnummer> 
> xmltop[['Krankenhaustraeger']][['Krankenhaustraeger_Art']][['Art']]
<Art>freigemeinnützig</Art> 
> 
> xmlfile=xmlParse("H:/R/GQB/260100034-00-2015-xml.xml")
> xmltop = xmlRoot(xmlfile)
> xmltop[['Krankenhaus']][['Kontaktdaten']][['IK']]
<IK>260100034</IK> 
> xmltop[['Krankenhaus']][['Kontaktdaten']][['Standortnummer']]
<Standortnummer>00</Standortnummer> 
> xmltop[['Krankenhaustraeger']][['Krankenhaustraeger_Art']][['Art']]
<Art>freigemeinnützig</Art> 
> 
> xmlfile=xmlParse("H:/R/GQB/260100089-00-2015-xml.xml")
> xmltop = xmlRoot(xmlfile)
> xmltop[['Krankenhaus']][['Kontaktdaten']][['IK']]
<IK>260100089</IK> 
> xmltop[['Krankenhaus']][['Kontaktdaten']][['Standortnummer']]
<Standortnummer>00</Standortnummer> 
> xmltop[['Krankenhaustraeger']][['Krankenhaustraeger_Art']][['Art']]
<Art>öffentlich</Art> 
> 
> #gewuenschtes Ergebnis nach automatisiertem Einlesen und Parsen und Auslesen (Tabelle manuell erstellt und in Zwischenablage kopiert)
> Ergebnis <- read.table(file="clipboard", sep="\t", header=TRUE)
> Ergebnis
  IK.Nummer Standort              Art
1 260100023        1 freigemeinnützig
2 260100034        0 freigemeinnützig
3 260100089        0       öffentlich
Zuletzt geändert von jogo am Mo Jun 19, 2017 6:24 pm, insgesamt 1-mal geändert.
Grund: Formatierung
Benutzeravatar
student
Beiträge: 674
Registriert: Fr Okt 07, 2016 9:52 am

Re: mehrere .xml-Dateien mit gleicher Struktur einlesen

Beitrag von student »

Hallo sunshine,

als R-Anfänger sich gleich durch so eine Herausforderung wühlen, ist schon nicht schlecht!

Die Kontrollstruktur while zeigt folgendes Code-Fragment:

Code: Alles auswählen

	# Datei festlegen:
	Start <- 1
	Ende <- Anzahl_Dateien
	for (i in Start:Ende) {

# Dateien öffnen zum Lesen und einzeln Zuordnen:
		Datei <- file(Dateien[i], "r")
		
		while(Halt == FALSE){	# Durchlaufen, solange EOF nicht erreicht ist
		
			Zeile <- readLines(Datei, n = 1)	# Lese nur eine Zeile ein
						
			.... Anweisungsblock ...
			
		} # Ende while-Schleife
	
		Halt = FALSE		# Abbruchbedingung löschen
		close(Datei)		# Geöffneter Info-Konal schließen!
		
	} # Ende for-Schleife
Mit diesem Fragment habe ich die csv-Dateien eingelesen (im ... Anweisungsblock ...) um dann im nächsten Abschnitt nach den benötigten Informationen in der Datei gesucht, diese gesammelt und in eine Ausgabedatei geschrieben. Das war "fummelei" ...

Leider kann ich Dir nur dieses Fragment anbieten und nicht den gesamten Code. Sorry.

Du verwendest ja schon das Paket XML und wenn ich Dich richtig verstehe, erzeugts Du letztendlich das Datenobjekt Ergebnis.
Viele Grüße,
Student
-----------------------------------------------------------------------------------------------------------------------
faes.de, Datenanalyse mit R & das Ad-Oculos-Projekt
Das Ad-Oculos-Projekt auf YouTube

Habe Mut, dich deines eigenen Verstandes zu bedienen! (Kant)
sunshine_privat

Re: mehrere .xml-Dateien mit gleicher Struktur einlesen

Beitrag von sunshine_privat »

Hallo Student,

vielen Dank für Deine Antwort, jetzt verstehe ich auch Dein Code-Fragment, weil ich im Anweisungsblock praktisch das parsen und die Zellen etc. "anweisen" muss" und wenn ich es richtig verstanden habe, das Ganze dann in ca. 2500 "Schleifen" läuft - hab grad geschaut, zu den Schleifen gibts ne Menge Infos ... da werd ich mal weitersuchen, wie ich dann den Anweisungsblock getalten muss. Danke!

Viele Grüße
sunshine
Antworten