gpxからcsvファイルへ

gpxからcsvファイルへ
<wpt lat="1.345529841" lon="103.7577152"><time>2010-01-01T00:00:00Z</time</wpt> 
<wpt lat="1.345529841" lon="103.7577152"><time>2010-01-01T00:00:00Z</time></wpt> 
<wpt lat="1.3982529841" lon="103.90877152"><time>2010-01-01T00:00:00Z</time></wpt> 

上記の行を次に変換する必要があるファイルがあります。

         1.345529841,103.7577152,2010-01-01 00:00:00
         1.345529841,103.7577152,2010-01-01 00:00:00
         1.3982529841,103.90877152,2010-01-01 00:00:00

ベストアンサー1

GPXはXML形式です。awkそのため、安定して使用したりsed解析することはできません。

代わりに、次のようなものを使用してください。XMLスター(XML文書の形式が正しくエラーがないと仮定):

$ xmlstarlet sel -t -m '//wpt' \
          -v '@lat' -o ',' \
          -v '@lon' -o ',' \
          -v 'time' -nl data.gpx
1.345529841,103.7577152,2010-01-01T00:00:00Z
1.345529841,103.7577152,2010-01-01T00:00:00Z
1.3982529841,103.90877152,2010-01-01T00:00:00Z

または:

xmlstarlet sel -t -m '//wpt' -v 'concat(@lat, ",", @lon, ",", time)' -nl data.wpx

以下を使用することもできますxq(部分的yqhttps://kislyuk.github.io/yq/):

$ xq -r '.. | .wpt? // empty | .[] | map(values) | @csv' data.gpx
"1.345529841","103.7577152","2010-01-01T00:00:00Z"
"1.345529841","103.7577152","2010-01-01T00:00:00Z"
"1.3982529841","103.90877152","2010-01-01T00:00:00Z"

その後、すべてのノードを見つけ、wptすべての属性と子ノードの値を抽出し、それからCSV出力を生成します。

列を並べ替える必要がある場合、または各列に使用する値を選択する必要がある場合でも、これを行うことができます。

$ xq -r '.. | .wpt? // empty | .[] | [."@lat", ."@lon", .time] | @csv' data.gpx
"1.345529841","103.7577152","2010-01-01T00:00:00Z"
"1.345529841","103.7577152","2010-01-01T00:00:00Z"
"1.3982529841","103.90877152","2010-01-01T00:00:00Z"

おすすめ記事