Categories: Linux

Garmin ForeRunner TCX Dateien zerlegen

Während unseres Elba Urlaubs habe ich mit meinem ForeRunner fleissig unsere Radtouren verfolgt, leider ist dabei was schief gegangen und mein GPS Log startet und endet am ersten Tag unseres Urlaubs – obwohl wirklich alle Strecken korrekt aufgezeichnet in der TCX-Datei stehen.

So wie ich das sehe hat der ForeRunner einfach immer am nächsten Tag bei der alten Strecke weiter gemacht anstatt den Track abzuschließen und einen neuen zu beginnen – werd ich wohl noch mal das Handbuch konsolidieren müssen 😉

Wie auch immer, das Kind ist bereits in den Brunnen gefallen – also muss eine Lösung her!

Normalerweise verwende ich RouteConverter für das Zerlegen und Umwandeln meiner TCX Dateien, allerdings klappt das in diesem Fall nicht weil RouteConverter keine TCX Dateien schreiben kann und allen ähnlichen Formaten fehlen dann die Pulswerte.

Aus der Not heraus habe ich mir dann das TCX Format ein wenig angeschaut und festgestellt dass es klassisches XML ist und in der Datei die einzelnen Tracks schön aufzufinden sind.

Wenige Minuten später steht schon mal ein Bash Script welches mir die Datei nach dem im Time-Tag angegebenen Tagen aufsplittet:

#!/bin/bash

if [ ! „$1“ ]; then
echo „Bitte zu lesende Datei angeben!“
exit
fi

IFS=“

if [ „$3“ ]; then
START=$(grep -n „<Track“ $1| head -1| awk -F‘:‘ ‚{print $1}‘)
START=$((START-1))
head -$START $1
ENDE=$(($3-$2))
head -$3 $1 |tail -$ENDE
ENDE=$(grep -n „</Lap>“ $1|tail -1| awk -F‘:‘ ‚{print $1}‘)
GESAMT=$(wc -l $1|awk ‚{print $1}‘)
ZENDE=$((GESAMT-ENDE+1))
tail -$ZENDE $1

else

for T in $(grep -A2 „<Track>“ $1|grep „Time“); do

TAG=$(echo $T|awk -F‘>‘ ‚{print $2}’|awk -F'<‚ ‚{print $1}’|awk -F ‚T‘ ‚{print $1}‘)

if [ ! „X$TAG“ == „X$LASTTAG“ ]; then
START=$(grep -n „<Time>$TAG“ $1|head -1|awk -F‘:‘ ‚{print $1}‘)
START=$((START-3))
ENDE=$(grep -n „<Time>$TAG“ $1|tail -1|awk -F‘:‘ ‚{print $1}‘)
ENDE=$((ENDE+2))
echo -e „$TAGn Start: $STARTn Ende: $ENDEn“
fi

LASTTAG=$TAG

done

echo „Bitte Start- und Endzeile mit angeben!“

fi

Ich habe das Programm unter dem Namen „split_track.sh“ abgespeichert, beim ersten Aufruf muss man lediglich den Dateinamen der TCX-Datei angeben und schon werden einen die möglichen Start/Endpunkte angezeigt. Beim zweiten Starten gibt man dann einfach den entsprechenden Start/Endpunkt zusätzlich als Parameter an und leitet die Ausgabe mit „>“ in die gewünschte Datei um.

Das Ergebnis ist eine frische TCX Datei mit lediglich dem Tag den man vorher ausgewählt hat.
Diese hatte in meinem Fall allerdings einen kleinen Schönheitsfehler, die Streckendaten waren über Tage summiert und daher starteten die Daten vom 3. Tag z.B. bei Kilometer 67 und nicht bei Null wie ich es für eine Tagestour erwartet hätte.

Also muss ein weiteres Script her das die einzelnen Werte in „DistanceMeters“ um einen Angegebenen Wert korrigiert!

#!/bin/bash

if [ ! „$1“ ]; then
echo „Bitte zu lesende Datei angeben!“
exit
fi

if [ ! „$2“ ]; then
echo „Bitte falschen Startwert Entfernung angeben!“
FST=$(grep „DistanceMeters“ $1|head -2 |tail -1|awk -F‘>‘ ‚{print $2}’| awk -F ‚<‚ ‚{print $1}‘)
echo „z.B.: $FST“
exit
fi

FSTART=$2
GSTART=$(echo $FSTART|awk -F‘.‘ ‚{print $1}‘)

IFS=“

for I in $(cat $1); do

TYP=$(echo $I|awk -F‘>‘ ‚{print $1}’|sed -e „s/ //g“)
WERT=$(echo $I|awk -F‘>‘ ‚{print $2}’| awk -F ‚<‚ ‚{print $1}‘)
WERTGANZ=$(echo $WERT|awk -F‘.‘ ‚{print $1}‘)
if [ „X$TYP“ == „X<DistanceMeters“ ]; then
if [ $WERTGANZ -ge $GSTART ]; then
NEUWERT=$(echo „scale=7; $WERT-$FSTART“|bc)
echo “ <DistanceMeters>$NEUWERT</DistanceMeters>“
else
echo “ <DistanceMeters>$WERT</DistanceMeters>“
fi
else
echo $I
fi

done

Vom Ablauf her funktioniert das zweite Script (ich habe es entf_chg.sh genannt) fast gleich, beim ersten Aufruf nur den Dateinamen der TCX Datei angeben und anschließen noch als Parameter den abzuziehenden Meterwert inkl. Nachkommerstellen (durch Punkt getrennt – nicht Komma!) angeben.

Leitet man die Ausgabe dann erneut in eine Datei um, erhält man eine neue TCX Datei mit hoffentlich korrekten Entfernungsangaben. Der Script-Durchlauf kann etwas dauern, mir war wichtiger dass es funktioniert – die Geschwindigkeit war da erst mal zweitrangig.

Bei meinen Versuchen hatte ich ab und zu noch das Problem dass nach dem Splitten in der TCX Datei noch ein LAP-XML-Eintrag vorhanden war ohne vernünftige Werte, den musste ich händisch rauslöschen damit das zweite Script korrekte Entfernungsangaben liefern konnte.

Alles in allem ist das ganze sicher nicht perfekt, aber es hat bei mir sehr gut funktioniert und eventuell hilft es ja dem einen oder anderen bei einem ähnlichen Problem weiter 🙂

Manfred

Recent Posts

Fujitsu RX300 S7 – RAID 5 mit amCLI reparieren

Ich habe schon länger nicht mehr hier im Blog geschrieben, was nicht daran liegt dass…

3 Stunden ago

VM – ZFS Partition online vergrößern

Man macht es nicht jeden Tag, darum schadet es nicht sich's kurz zu notieren... Hier…

1 Jahr ago

Samba Password History für einen User löschen

Meine Suche bei Google hatte mal wieder keinen vernünftigen Treffer gelandet, das Problem - ich…

1 Jahr ago

HP Eine Firma von der ich nicht mal geschenkte Drucker nehmen würde!!!

Ich muss mal eben etwas Druck ablassen, ein Kunde von mir setzt einen Drucker von…

2 Jahren ago

IRMC Console Redirection ohne Lizenz

Wer beim Server bestellen vergessen hat die erweiterte IRMC Lizenz zu ordern, der steht vor…

2 Jahren ago

WOL im BIOS aktivieren reicht nicht immer

Ich nutze seit langer Zeit ein System für meine Backups welches in der Nacht von…

2 Jahren ago