Konzept um mit einer Textdatei zu arbeiten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Bei allen Screenshots von Logbüchern habe ich bisher zumindest noch nichts gesehen, was sich nicht einfach in eine Datenbank einlesen lassen würde und Converter für CSV gibt es auch. Das Format lässt sich ja erhalten, somit nicht wirklich ein Problem.

http://www.dxshell.com/adif-master.html
BlackJack

@Melewo: Jain. Ich habe immer noch das Gefühl Du verschliesst die Augen vor der Erweiterbarkeit des Formats und ignorierst einfach alles was Du noch nicht irgendwo gesehen hast. Ein Werkzeug sollte halt nicht nur mit den Beispielen die Du gesehen hast zurecht kommen, sondern mit dem Format an sich. Genau dafür gibt es ja Spezifikationen, damit man sich nicht an einer handvoll Beispielen orientieren muss und dann jeder das etwas anders interpretiert oder Teile zu denen er noch kein Beispiel gesehen hat einfach ignoriert.

Solche Dateien in eine Datenbank einzulesen kann je nach Datenbank und was man konkret machen möchte tatsächlich *sehr* einfach sein, wenn man Beispielsweise eine dokumentorientierte DB verwendet und das Log einfach komplett als Dokuments/BLOB darin speichert, oder immer noch einfach wenn man Die Datensätze aus dem Log jeweils in einen BLOB speichert, aber auch durchaus etwas aufwändiger wenn man das Log und die Datensätze zwar aufbricht und speichert, aber eben auch *alles* speichern möchte, so das man aus den Daten in der DB auch die ursprüngliche Datei wieder rekonstruieren kann.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Ich möchte mich deshalb nicht streiten, weil es sinnlos wäre, bevor power74 nicht ausführliche Dateien preisgibt, was darin alles enthalten sein könnte. Doch hier ist mal ein simpler PHP ADIF_Parser.

https://github.com/magicbug/phpadifpars ... parser.php
BlackJack

@Melewo: Der ist *zu* simpel. Die Tags sind „case insensitiv“ und sowohl '<eoh>' als auch '<eor>' können in den Nutzdaten vorkommen. Ausserdem ist's PHP und nicht Python. :-) Ein ADIF-Parser in Python ist im `hamtools`-Package enthalten. Und der kommt mit den beiden genannten Fällen klar.

Edit: Und es ist egal was in den Dateien enthalten ist: Ein Parser sollte sich an die Spezifikation halten und nicht an Beispieldaten orientieren. Zumal die Spezifikation/das Format ja wirklich relativ einfach ist. Da ist ja nicht einmal etwas rekursives in der Grammatik — ein Lexer reicht schon aus.
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

BlackJack hat geschrieben:Wobei es das anscheinend nicht für Python 3 gibt. Müsste man also portieren oder sich weiter umschauen. Oder Python 2.7 nehmen.
Ich habe unter Python3 keine Probleme damit. Allerdings ist die Beispiel-Datei defekt. An zwei Stellen die Feldlängen zu lang (vermutlich durch das Anonymisieren), was den Parser durcheinander bringt. Leider ist der Code nicht so robust, dass das erkannt word, oder zumindest irgendeinen Fehler gibt; stattdessen gibt's beim Iterieren einfach nur eine leere Liste. Wenn man die Feldlängen anpasst, kommt allerdings folgendes raus:

Code: Alles auswählen

Python 3.6.1 (default, Mar 27 2017, 00:27:06) 
[...]
In [1]: import adif
In [2]: f = open('logbook.adi', 'r')
In [3]: reader = adif.Reader(f)
In [4]: reader.adif_ver
Out[4]: '2.2.7'
In [5]: reader.header_present
Out[5]: True
In [6]: [field for field in reader]
Out[6]: 
[OrderedDict([('freq', '7.041271'),
              ('call', 'AB1CDE'),
              ('mode', 'PSK63'),
              ('name', 'XXXXX'),
              ('qso_date', '20170709'),
              ('qso_date_off', '20170709'),
              ('time_off', '212515'),
              ('time_on', '212200'),
              ('qth', 'Hiero'),
              ('eqslsdate', '20170711'),
              ('gridsquare', 'JN00AB'),
              ('band', '40m'),
              ('station_callsign', 'AB2FGH'),
              ('my_gridsquare', 'XXXXXX'),
              ('my_city', 'Dort'),
              ('app_datetime_on', datetime.datetime(2017, 7, 9, 21, 22)),
              ('app_datetime_off', datetime.datetime(2017, 7, 9, 21, 25))])]
Benutzeravatar
power74
User
Beiträge: 14
Registriert: Donnerstag 3. September 2015, 12:25
Wohnort: in der Nähe von Zürich

...vor lauter Sommer kaum Zeit für den Bildschirm, daher...

helfe ich mir für den Moment mit einer Applikation, die es beriets gibt für mein Problem (gut gesucht ist halb gefunden...)
Die heisst ADIFMaster, ist portable und free.

Danke an alle.
AttributeError: 'power74' object has no attribute 'nervenbehalten'
Antworten