旅に出たり、走ったり、旅に出て走ったり

走った記録や旅行記、旅ランの記録などを書いています。Garminなどのランガジェットの紹介もします。

GarminConnectからラップタイムデータを一括ダウンロードしてくる〜その3〜

前回まででラップデータを一括してダウンロードできました。

 

genmaigenmai.hatenablog.com

 

これに日付情報を付けて、分析できるようにしようかと思います。

こちらの環境は、macOS Monterey(12.0.1)、GoogleChrome(97)、ターミナル(Bash)で実行しています。

Bashでコマンド打ち込んでるだけなので、Linuxの方はそのまま使えるような気がします。

Windowsの方は、Windows Subsystem for Linux(WSL) を入れて、Bashを使えるようにすると同じようにできるかも。こちらに環境ないから、知らんけどw

詳しくは[Windows10 Bash]で検索をお願いします。

 

アクティビティIDとトレーニング開始日時が記録されたcsvファイルの作成

レーニングの日時を調べる方法は無いかと調べていると、tcxファイルにもgpxファイルにも日時は記録されているようです。どちらもベタベタのxmlファイルです。tcxファイルの方がトレーニング日時のタグが取り出しやすいのでこちらを使ってみます。

落ちてきたファイル名の数字部分はアクティビティIDで、これはcsvと同じです。

では、tcxを持ってきましょう。

前回のcsvを取ってきたスクリプトcsvをtcxに置き換えて同じように流します。

そうするとダウンロードフォルダに大量のtcxファイルが落ちてきます。

落ちてきたtcxファイルをcsvファイルと同じフォルダに放り込んでおきます。

 

試しにtcxファイルを1つ開いてみると、トレーニング日時は、<Id>タグに入ってました。

 

f:id:Genmai_17:20220123175610p:plain



2022年の1月3日、5時49分32秒にスタートしています。

この日時は世界時(UTC)のようで、日本時刻より9時間遅れています。この例だと実際に走り出したのは、午後3時ちょっと前。日本での早朝ランの記録は前日で記録されていることになります。

タグで挟まれているので、grepsedで取り出し可能です。

grep -o "<Id[^>]*>[^<]*</Id>" $file | sed -e "s/<Id>\(.*\)<\/Id>/\1/"

試しにコマンドで打ち込んでみる。

f:id:Genmai_17:20220123190737p:plain

お〜ちゃんと日付が出てきた。

 

これをカレントフォルダ内の全てのtcxファイルにforループで適用します。

cutコマンドでファイル名からアクティビティID部分だけを切り出し、アクティビティIDと日時の2列が記録されたcsvファイルを作ります。ここではdateId.csvとします。←ネーミングセンス無し。

for file in `ls *.tcx `; do grep -o "<Id[^>]*>[^<]*</Id>" $file | sed -e "s/<Id>\(.*\)<\/Id>/\1/" | echo -e ${file},$(cat) |cut -c 10-19,24- ;done >dateId.csv

 

ラップデータcsvの各レコードの先頭にアクティビティIDを追加

上で作ったファイルとアクティビティIDでぶつけるため、ラップcsvファイルの各行の先頭にアクティビティIDを含むファイル名をくっつけます。awkでやってみます。元のcsvファイルには16列あったので、それをファイル名の右に全部出力します。

cat $file | awk -F"," '{print "'${file}'" "," $1 "," $2 "," $3 "," $4 "," $5 "," $6 "," $7 "," $8 "," $9 "," $10 "," $11 "," $12 "," $13 "," $14 "," $15 "," $16}' 

これだと1つのファイルしか処理されません。また、ファイル名が全部出てしまうので、アクティビティIDのみにします。

 

ファイル名からcutコマンドでアクティビティIDの部分のみを取り出し、フォルダ内のactivity_で始まるcsvファイルにforループで適用します。出力ファイルには、頭に"id_"を付けておきます。

for file in `ls activity_*.csv `; do cat $file | awk -F"," '{print "'${file}'" "," $1 "," $2 "," $3 "," $4 "," $5 "," $6 "," $7 "," $8 "," $9 "," $10 "," $11 "," $12 "," $13 "," $14 "," $15 "," $16}' |cut -c10-19,24->id_$file;done

 

ラップデータcsvをヘッダ行を削除して結合

もう、これで材料は揃いました。それでは大量のcsvファイルを1つに繋げます。catでも繋がるんですけど、2つめ以降のファイルのヘッダが邪魔です。awkで除きましょう。もちろんcatで繋げてから表計算ソフトで加工してもできます。

awk 'NR==1 || FNR!=1' id_*.csv>lap_activity.csv

はい、つながりました。

 

ファイルを統合して日付入りのラップデータcsvを作成

では2つのファイルをアクティビティIDをキーに統合して1つのcsvにしましょう。もちろん、シェルでやらなくても表計算ソフトでvlookup()でもいけます。

join -t"," -a1 dateId.csv lap_activity.csv>lap_date_activity.csv

できあがりです。あとはexcelで自由に扱えます。

f:id:Genmai_17:20220123185936p:plain

1年間で3117ラップ。これで分析しやすくなりました。

これで、1年間のラップペースごとに結果をみてみるとこれ。

f:id:Genmai_17:20220123190223p:plain

EとLSDペースで76%。Mペース、Tペースって順番に少なくなって行ってます。お〜ちゃんとできたっぽい。

 

前はこれだったので、ちゃんと分かるようになりました。満足です。

f:id:Genmai_17:20220122194255p:plain

 

にほんブログ村 その他スポーツブログ マラソンへ
にほんブログ村