txt-Datei bearbeiten - passendes Skript?

J

Jupp53

Gast
Anfängerfrage!

Schachpartien werden oft im .pgn-Format gespreichert. Es handelt sich um Dateien, die mit einfachen Texteditoren gut bearbeitet werden können. Auf populären Servern gespielte Partien lassen sich in diesem Format mit Zusatzinformationen, etwa Stand der Uhr und Stellungsbewertung, herunterladen und dann weiter analysieren und speichern. Dabei sind in diesen Dateien jede Menge für die weitere Verarbeitung unnütze Informationen, die die Lesbarkeit erschweren. Deshalb möchte ich ein Skript mit folgenden Funktionen schreiben:

  • Löschen von Zeilen mit bestimmten Tag-Informationen, z.B. UCT-Time.
  • Ersetzen von bestimmten Textstellen, z.B. Alias durch Klarnamen.
  • Löschen von Zeichenketten unter Bedingungen. Z.B. soll die Restzeit nur im Kommentar auftauchen, wenn für den Zug eine bestimmte Mindestzeit verbraucht wurde.
  • Einsetzen von Zeilen mit Tag-Informationen an vorgegebenen Stellen, z.B. über Diagramme.

Das soll im ersten Schritt automatisiert ablaufen. Wenn das klappt soll evtl. ein GUI die Möglichkeit zur Eingabe verschiedener Varianten der Funktionen erstellt werden.

Ich habe gerade angefangen mit Learn Python the hard way, kann also noch nicht skripten oder gar programmieren. Der Aufwand würde sich schon lohnen, da die manuelle Bearbeitung der Dateien zeitaufwändig ist.

Die oben beschriebenen Funktionen sind sicher Alltagskost. Bei der Suche nach Programmen außerhalb von pgn-Skripten habe ich den Hinweis auf sed unter Linux gefunden, weiß aber nach dem ersten Lesen nicht, ob das wirklich geeignet ist. Ich möchte nicht das Rad noch einmal erfinden und dann noch zusätzlich feststellen müssen, dass mein Rad rund statt oval hätte sein sollen.

Kennt jemand hier in irgendeinem anderen Bereich ein Skript, ein Programm, dass diese Funktionen variabel "in einem Rutsch" für den Benutzer erledigen kann?
Falls ja: Lässt sich das Programm modifizieren?
Falls nein: Ist Python ein guter Ansatz, um etwas in dieser Richtung auf die Beine zu stellen?

Danke für alle, die einen Hinweis geben.
 
Kenne mich mit der Benutzung von pgn Dateien nicht aus... drum weiß ich nicht, ob auch dieses hier praktikabel wäre:
Du könntest auch einen der fertigen pgn Parser von GitHub für Python, Java, etc. benutzen.
Programmieren musst Du dann immer noch, aber statt die Textdatei umzuformatieren, könntest Du die pgn Dateien so belassen, wie sie sind, liest sie mit dem Parser ein und gibst nur die Informationen daraus aus, die Du möchtest und so formatiert, wie Du das möchtest.
https://github.com/topics/pgn
-
Direkt zu Deiner Frage: Mit Python kriegt man das Umschreiben der pgn Dateien, so wie von Dir beschrieben bestimmt hin.
 
Zuletzt bearbeitet:
da das .pgn format text-basiert ist, kann man da einfach die sachen machen die du möchtest, mit python geht das auch einfach.

falls du mehr vor hast gibt es auch python-chess, wobei das als anfänger etwas zuviel des guten sein könnte. du kannst ja mal so eine .pgn datei anhängen und beschreiben, was rauskommen soll.
 
Danke an Alle. pgn-extract hatte ich schon gefunden. Es passt nicht ganz. LucasChess hat viele Möglichkeiten und ist ein tolles Programmpaket, aber nichts in meine Richtung.

Das Stichwort Parser hilft mir weiter. Die Beschäftigung mit dem Projekt wird seine Zeit benötigen. Bei Erfolg oder Festhängen melde ich mich hier.

Ein Beispiel einer Datei mit den gewünschten Veränderungen nach # ... habe ich angefügt. Hier nehme ich Hinweise zu Konventionen/Lesegewohnheiten gerne an und übernehme die in Zukunft.
 

Anhänge

  • Beispiel.7z
    1,5 KB · Aufrufe: 237
@Yuuri

Das verstehe ich nicht. json kannte ich nicht und habe mir kurz nach Suche https://www.json.org/json-de.html angesehen. Danach stellt sich mir die Frage, was der Vorteil davon ist, von utf-8 in ein anderes Format zu konvertieren. Die Funktionen muss ich doch so oder so hinbekommen.

Edith ergänzt noch die Regel: Jeder zusätzliche Arbeitsschritt, jedes zusätzliche Bauteil erhöht das Fehlerrisiko.
 
Zuletzt bearbeitet von einem Moderator:
JSON ist halt bedeutend einfacher zugänglich und maschinell verarbeitbar als so eine PGN-Datei. Außerdem kannst du so interoperabel mit mehreren Schnittstellen auf die Daten zugreifen. Keine Ahnung ob PHP, C#, Java, Bash und Co. jeweils einen Parser für PGN besitzen, nur weil du bspw. auf einmal doch noch andere Daten benötigst, als die, die du eh schon ausgibst mit deinem Script.
Jupp53 schrieb:
Danach stellt sich mir die Frage, was der Vorteil davon ist, von utf-8 in ein anderes Format zu konvertieren.
Die Formate sind PGN und JSON. Das Charset ist unabhängig und kann utf-8 sein.
Jupp53 schrieb:
Die Funktionen muss ich doch so oder so hinbekommen.
Ja, aber indem du das PGN Format parst und in JSON konvertierst, ist es nach dem Schritt bedeutend einfacher zugänglich für evtl. andere Schritte. Man setzt nicht umsonst in APIs, Configs und Co. auf JSON/XML/YML/..., da es maschinell einfacher verarbeitbar und bedeutend weniger fehleranfällig ist als eine eigene DSL.

Du kannst natürlich gern alles direkt mit Python rausziehen, aber wenn du den Schritt zur Überführung PGN -> JSON erstellst, kannst du das als Basis für ggf. weitere Scripte (universell, nicht nur Python mit python-chess) verwenden, da jede Sprache irgendwo nen JSON Parser besitzt, aber nicht speziell für PGN.
Jupp53 schrieb:
Edith ergänzt noch die Regel: Jeder zusätzliche Arbeitsschritt, jedes zusätzliche Bauteil erhöht das Fehlerrisiko.
Das lass ich gern gelten, aber insofern du keine Tests umsetzt, ist das Argument überfällig. ;)

Nur als Denkanstoß.
 
@Yuuri

Danke!

Ich muss ein paar Begriffe für mich richtig klar kriegen, um deinen Post sicher zu verstehen. Vorher ist eine Antwort stochern im Nebel. (Format und Charsets, Parser)

Jetzt setze ich mich erst einmal hin und lerne, bevor ich weiter frage. Das Argument, die Arbeit später eventuell jenseits des Projektes nutzen zu können, hat seinen Reiz. Von der Logik her ist das Thema allgemeiner als Automatisierung eines Aspekts der Analyse von Schachpartien zur Aufbereitung für weiteres Training.

Verdeutlichung: Das hier https://de.wikipedia.org/wiki/Portable_Game_Notation verdeutlicht mir die Unterscheidung Format und Charset. Die Begriffe tauchen da auch auf und ich habe sie vorher überlesen.
 
Zurück
Oben