suche Dateien mit <speed>WERT GRÖSSER ALS 18.05</speed>

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
GregorS
Beiträge: 2629
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

Re: suche Dateien mit <speed>WERT GRÖSSER ALS 18.05</speed>

Beitrag von GregorS » 05.02.2024 11:32:09

niemand hat geschrieben: ↑ zum Beitrag ↑
05.02.2024 10:36:49
pachhenk hat geschrieben: ↑ zum Beitrag ↑
05.02.2024 07:12:41
Vom "trivialen Code" hatte ich eben ursprünglich geträumt.
Wenn’s wirklich trivial werden soll, wäre vielleicht Python einen Blick wert? Da ließe sich die vorliegende Aufgabe mit Bordmitteln lösen, und hübsch lesbar wär’s auch.
Das Blöde ist nur, dass sich der OP meinem Eindruck nach eher schwer mit derlei Dingen tut. Nur wegen so einer Sache eine Programmiersprache zu lernen ist wohl übertrieben. Andererseits macht das Programmieren irre Spaß ...

Naja, wie Du sagst, „einen Blick“ isses wert (wenn man die Kapazität hat).

Gruß

Gregor
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])

Benutzeravatar
heisenberg
Beiträge: 3567
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: suche Dateien mit <speed>WERT GRÖSSER ALS 18.05</speed>

Beitrag von heisenberg » 05.02.2024 12:49:15

niemand hat geschrieben: ↑ zum Beitrag ↑
05.02.2024 10:36:49
pachhenk hat geschrieben: ↑ zum Beitrag ↑
05.02.2024 07:12:41
Vom "trivialen Code" hatte ich eben ursprünglich geträumt.
Wenn’s wirklich trivial werden soll, wäre vielleicht Python einen Blick wert? Da ließe sich die vorliegende Aufgabe mit Bordmitteln lösen, und hübsch lesbar wär’s auch.
Ich bin jetzt nicht so der Python-Held. Zeig' Doch mal die bisherige Aufgabe als Python 3 Skript - Lösung. Ich bekomme aktuell noch Fehler, wenn ich das versuche, umzusetzen.

Code: Alles auswählen

#!/usr/bin/env python3

from pathlib import Path
import xml.etree.ElementTree as xetree

for path in Path('.').rglob('*.gpx'):
        print(path.name)
        data = xetree.parse(path.name)
        root = data.getroot()
        for e in root.findall(".//speed"):
                print(e.text)
Ausgabe:

Code: Alles auswählen

../t.py
2014-03-30 05-54 So..gpx
2018-04-17 09-16 Tue.gpx
2017-08-15 09-42 Tue.gpx
2019-09-17_20-02_Tue.gpx
2020-09-18_08-58_Fri.gpx
2023-05-31_07-24_Wed.gpx
Traceback (most recent call last):
  File "/home/heisenberg/gps/GPS-Tracks/../t.py", line 8, in <module>
    data = xetree.parse(path.name)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/xml/etree/ElementTree.py", line 1218, in parse
    tree.parse(source, parser)
  File "/usr/lib/python3.11/xml/etree/ElementTree.py", line 580, in parse
    self._root = parser._parse_whole(source)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
xml.etree.ElementTree.ParseError: unbound prefix: line 23, column 5
  • Der Dateiname wird ausgegeben.
  • Ein Fehler tritt vermutlich beim parsing der Datei "2023-05-31_07-24_Wed.gpx" auf. (... dessen XML-Struktur anders ist).
  • Speed-Werte werden nicht gefunden, vermutlich aufgrund der Namespace-Geschichte.
Nachtrag: Fehler behoben. Es war die fehlende Namespace-Definition für den osmand-Namespace.
Zuletzt geändert von heisenberg am 05.02.2024 13:23:52, insgesamt 1-mal geändert.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
heisenberg
Beiträge: 3567
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: suche Dateien mit <speed>WERT GRÖSSER ALS 18.05</speed>

Beitrag von heisenberg » 05.02.2024 13:07:08

Das mitgelieferte xml.etree.ElementTree kann wohl kein vollständiges XPath. Deswegen muss man da lxml ( --> apt install Debianpython3-lxml) verwenden.

Damit tut das:

Code: Alles auswählen

#!/usr/bin/env python3

from pathlib import Path
import lxml.etree

my_path     = "."
my_pattern  = "*.gpx"
my_attr     = "speed"

for path in Path(my_path).rglob(my_pattern):
    root = lxml.etree.parse(str(path.parent) + "/" + str(path.name)).getroot()
    max_speed = 0
    for element in root.xpath(".//*[local-name()='"+my_attr+"']"):
        speed = float(element.text)
        if (speed > max_speed):
            max_speed = speed
    print(path.name + " " + str(max_speed))
Ausgabe:

Code: Alles auswählen

2014-03-30 05-54 So..gpx 12.484431266784668
2018-04-17 09-16 Tue.gpx 9.54
2017-08-15 09-42 Tue.gpx 10.09000015258789
2019-09-17_20-02_Tue.gpx 7.94
2020-09-18_08-58_Fri.gpx 29.513
2023-05-31_07-24_Wed.gpx 16.9
2015-06-06 07-21 Sa..gpx 16.476728439331055
2016-04-25 15-50 Mo..gpx 7.5
Die Python-Lösung ging mir jetzt aber nur dadurch so leicht von der Hand, weil ich vorher den XML-Part vollumfänglich verstanden habe.
Zuletzt geändert von heisenberg am 05.02.2024 15:17:43, insgesamt 3-mal geändert.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
heisenberg
Beiträge: 3567
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: suche Dateien mit <speed>WERT GRÖSSER ALS 18.05</speed>

Beitrag von heisenberg » 05.02.2024 14:04:44

Falls sich jemand intensiver mit dem Parsen von XML via awk beschäftigen will ( :facepalm: :mrgreen: :roll: ), hier wäre ein Startpunkt dafür:

https://community.unix.com/t/improving- ... ies/393167
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
pachhenk
Beiträge: 120
Registriert: 19.06.2004 15:49:36
Lizenz eigener Beiträge: MIT Lizenz

Re: suche Dateien mit <speed>WERT GRÖSSER ALS 18.05</speed>

Beitrag von pachhenk » 12.02.2024 07:31:11

pachhenk hat geschrieben: ↑ zum Beitrag ↑
05.02.2024 07:10:57
heisenberg hat geschrieben: ↑ zum Beitrag ↑
04.02.2024 14:52:52
...
Das ist dann das aktuelle Script:

Code: Alles auswählen

#!/bin/bash
...
done < <( find . -iname "*.gpx" )
...
Was soll ich sagen?
DANKE!
Die neue Version lief perfekt durch. Auch in der grossen Sammlung alle mit Ausgabe der MaxSpeed. Ds Ergenis kann ich jetzt weiterverarbeiten und bin zuversichtlich, dass ich das hinkrieg. Mal sehen... ;-)
Ich hab nochmal richtig viel Zeit investiert um die Ausgabe von Deinem Skript für mein Ziel zu verwerten. Komme aber kein bisschen vorwärts. Das einzige was ich verstehe ist die erste Zeile. ;-)
Hier laufen mittlerweile wichtigere Sachen auf und warten. Ich muss das hier erst mal abbrechen.

Antworten