R: Wie man ein PGN als Datenrahmen einliest

8

Ich habe eine einzige .pgn Portable Game Notation einer großen Anzahl von Schachspielen. Die Spiele sind in der Datei wie folgt enthalten:

%Vor%

Ich möchte diese Daten als Datenframe lesen, wobei die Spaltenüberschriften einfach das Wort links von der Zeichenfolge in Anführungszeichen sind und die Zeilenwerte in den Anführungszeichen stehen. Eine andere Spalte würde eine Zeichenfolge aller Züge enthalten.

Ich bin völlig neu in R und kann einfach nicht herausfinden, wie man eine Datei einliest, die noch nicht in einem bekannten Format ist.

readLines() sieht vielversprechend aus.

    
Parseltongue 19.05.2015, 22:34
quelle

2 Antworten

7

Versuchen Sie Folgendes:

%Vor%

Diese Lösung geht davon aus, dass jedes Spiel 12 Zeilen umfasst, wie in Ihrem Beispiel. Wenn Spiele eine variable Anzahl von Zeilen aufnehmen, funktioniert diese Lösung nicht.

Erklärung der Regex-Zeilen (siehe ?regex für mehr):

%Vor%

In dieser Regex wollen wir das erste Wort, das einer eckigen Klammer folgt. Wir müssen dieser Klammer entkommen, da es ein Metazeichen ist. Es gibt andere Möglichkeiten, dies zu erreichen, ohne Escapes zu verwenden ( \ ), indem Sie beispielsweise [ zu einer Zeichenklasse machen, indem Sie sie in eckige Klammern setzen: sub("[[](\w+).+", "\1", pgn[1:12,1]) .

Die Klammern (eine Erfassungsgruppe) gehen zusammen mit \1 . Das \1 als zweites Argument für sub sagt, dass die ursprüngliche Zeichenfolge durch den Inhalt der ersten (und nur in diesem Fall) Erfassungsgruppe ersetzt werden soll. Wenn es eine zweite Erfassungsgruppe geben würde, würden Sie \2 verwenden, um sie zu referenzieren.

Der Inhalt der Erfassungsgruppe \w+ besteht aus einem oder mehreren Wortzeichen (die + bedeuten) (dargestellt durch \w ). Nach dem () wollen wir den Rest der Zeichenfolge abgleichen, was wir tun können, indem wir ein oder mehrere Zeichen (das ist . ) einmal oder mehrmals (d. H.% Co_de%) suchen.

Der Regex findet also die erste eckige Klammer und den ersten fortlaufenden Block von Wortzeichen, die wir erfassen, gefolgt von einem oder mehreren beliebigen anderen Zeichen.

Der zweite Regex: .+

Schauen wir uns den ersten Eintrag von "\[\w+ \\"(.+)\\"\]" : pgn[,1] an. Wir fangen gleich wie die erste Regex an, aber diesmal wollen wir nicht das erste Wort erfassen, sondern nur ein Leerzeichen, und dann wollen wir alles zwischen den beiden Mengen von [1] "[Event \"4th Bayern-chI Bank Hofmann\"]" erfassen. .

Sowohl \" als auch \ müssen mit Escapezeichen versehen sein, also haben wir ein Paar " , das eine Capture-Gruppe umgibt, die ein oder mehrere Zeichen ( \\" ) sucht, und schließlich haben wir ein Quadrat Klammer, die wir auf die gleiche Weise wie die erste eckige Klammer entkommen. Wenn wir dem .+ nicht entkommen würden, würde R denken, dass das Ende des ersten Arguments für " war, und nicht das sub als literales Zitat interpretieren.

Bei Einträgen wie Zeile 11 und 12 wird nichts gefunden, weil keine der Zeilen mit " beginnt und somit nichts ersetzt wird. Wir bekommen nur die ursprüngliche Saite in ihrer Gesamtheit zurück.

    
Jota 19.05.2015, 23:30
quelle
3

Folgendes möchte ich versuchen:

%Vor%     
gvrocha 19.05.2015 23:01
quelle

Tags und Links