よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

【データ加工 Vimマクロ編】Android地図アプリOsmAndの経路座標デー タを取得・加工する

今回は、以前の投稿の

で行った pgxファイル のデータ加工作業を、Vimエディタのマクロ でやってしまおう、という内容。
LinuxコマンドやVimコマンドは、無駄に書かないとちっとも覚えない。練習がてら。





地図座標の gpxファイルから、Linuxコマンドの grepコマンド で座標のある行のみ抽出して別ファイルに保存する所からやります。

gpxファイルは Android地図アプリ OsmAnd でGPS移動経路から取得したものを使っています。参考



  • pgxファイルの存在確認
$ ls | grep *.gpx ↩️
2022-02-06_15-27_Sun.gpx

1つあります。



  • Vimエディタでgpxファイルを見ると

f:id:chayarokurokuro:20220316192408j:plain

このようなファイル。gpxファイルはXMLのテキストファイルです。



  • gpxファイルから座標行を抽出し別ファイルに保存

上のgpxファイルから、座標データのある行のみを抽出し、別ファイルに新規保存します。

$ grep '<trkpt' 2022-02-06_15-27_Sun.gpx > locations.txt ↩️

locations.txt の名前で新規作成、保存された。


Vimで開くとこんなファイルが出来ている。

f:id:chayarokurokuro:20220316192603j:plain



  • 中身を確認、3行だけ見る
$ head -n 3 locations.txt ↩️
      <trkpt lat="33.3027671" lon="130.5579563">
      <trkpt lat="33.3027594" lon="130.5579148">
      <trkpt lat="33.3027713" lon="130.557914">

オーケー 👌



Vimでの編集作業

ここからVimエディタのマクロで編集作業をしていきます。

  • 目的は
      <trkpt lat="33.3027671" lon="130.5579563">
      <trkpt lat="33.3027594" lon="130.5579148">
      <trkpt lat="33.3027713" lon="130.557914">

↑のような形式のファイルを、
↓のようなCSV形式に変換すること。

33.3027671,130.5579563
33.3027594,130.5579148
33.3027713,130.557914

加工は Vimのマクロのみ を使う。修行なので。



$ vim locations.txt ↩️

画面がVimエディタに変わる。



Vimでコマンドを入力する時は、通常(コマンド)モードになっているか確認する。通常モードにするには エスケープキー を入力。



  • カーソルを先頭行の先頭文字列に移動させる
gg

カーソルが先頭行の文字に移動する。

f:id:chayarokurokuro:20220316132610j:plain



ザックリVimコマンドの使い方

マクロを登録する前に、Vimエディタのコマンドの使い方を見ておきます。



  • 通常(コマンド)モード にする

ESC(エスケープ)キーを押します。挿入(インサート)モード や 矩形(くけい ビジュアル)モードから、通常モード(コマンドモード)になります。



  • カーソルを現在の行の先頭に移動(通常モードのまま)
0

数字のゼロを入力



  • カーソルを現在の行の末尾に移動(通常モードのまま)
$

$ を入力する。



  • カーソルを 左/下/上/右 に一文字分だけ移動

キーボードには h j k l と並んで配置されている所があるが、それぞれが 左/下/上/右 の一文字分の移動コマンドに割り当てられている。
たとえば 「左に一文字カーソルを移動させる」場合は

h

小文字のエイチを入力する。カーソルが一文字左に移動する。

カーソルを5文字右に移動させたいなら

5l

l は小文字のエル。



  • 挿入モード(インサートモード)にする

エディタ編集画面に文字を入力したい場合は、通常モードで iao(小文字のオー) や I(大文字のアイ) などを入力すると、挿入モード(インサートモード)に切り替わり、文字が入力できるようになります。

モードの切り替えにいくつも種類があるのは、入力可能になる時のカーソルの位置がそれぞれで違うからです。
今回はあまり使いませんので説明省略します。



  • カーソルを緯度の座標の先頭(数字の3)に移動させる
/3

コマンドモードで /3 と入力した段階で、カーソルが元の位置から、その右側にある最初の 3 の位置へ移動する。
エンターキー で確定。



  • カーソルから左側の文字列を全て削除

カーソル位置が上の画像のように 3 にある状態で、d^ と入力すると、カーソルから左側の文字列を全て削除できる。

d^

f:id:chayarokurokuro:20220316134029j:plain



  • カーソルから右側の文字列を全て削除
D

大文字のD(ディー)です。



  • 区切り文字列のカンマを入力

現在のカーソル位置で入力モードにしたい時は i アイ を入力する。そして入力したい文字列を入力する。

たとえば、

  1. カーソル位置を緯度の最後の数値の後ろ(")に移動させ、
  2. カーソル位置で挿入モードにし(i を入力)、
  3. カンマ を入力

i などで挿入モードに切り替えると、次の画像のような表示が出る。

f:id:chayarokurokuro:20220316135452j:plain

「INSERT」と出ています。挿入(インサート)モード中であることを意味します。文字列入力可能状態です。

エスケープキー を入力すると通常(コマンド)モードに切り替わる。(文字列入力不可状態)



  • 変更を元に戻す

ESC(エスケープ)キー で通常のコマンドモードにした後、u 小文字のユー を入力すると、変更の1つ前に戻せる。更に u を押せば更に1つ前の変更点に戻せる。u を何度も押せば、最古の保存状態の所まで戻る。



よし、こんぐらいにしといたろうか。切りがない。(≧▽≦)
Vimエディタは、これらのコマンドと文字列入力を組み合わせることにより効率的な編集を可能とする。コマンドを覚えれば無敵。なかなか覚えられないけど(笑)



マクロの登録

上記のような方法で編集していく作業を、連続で記録し、1つのマクロとして登録する事ができる。
登録したマクロの実行により、複数の作業が一発で済むようになる。単純編集作業を何度も繰り返す必要がある時に使う。



  • マクロの実行方法

通常(コマンド)モードで、@マクロ名



  • マクロの登録方法

通常(コマンド)モードで、qマクロ名 → 編集作業 → qで登録終了



  • マクロ記録の実例

マクロ名「a」で <trkpt lat=" を削除する作業を登録してみる例。

  1. エスケープキー でコマンドモードに切り替える
  2. gg で先頭行の先頭文字列にカーソル移動させる
  3. マクロ記録の開始。qa と入力し、マクロ名「a」で以下の作業を登録を開始する
    1. /3 を入力することで緯度の最初の数値 3 にカーソルを移動させ、エンターキーで確定する
    2. d^ と入力し、カーソル位置から左側を削除する(<trkpt lat="3 より左側にあるので削除される)
    3. j と入力し、カーソルを下の行に移動させる
  4. q を入力し、マクロの登録を終了する



  • マクロ名「a」で登録した作業を実行するには

コマンドモードで @a と入力すれば、記録したマクロ (マクロ名「a」) が実行される。
@a を押す度に先頭の文字列 <trkpt lat=" がドンドン削除されていく。



  • マクロを複数回連続で実行するには

マクロ (マクロ名「a」) を実行する @a の前に、回数を指定してやれば良い。

5回マクロを連続実行したければ、5@a と入力する。
今回のマクロの場合、200@aなどとすれば、最後の行まで<trkpt lat="は削除される。

もう1つ別のマクロを登録してみます。



  • 先頭のスペースを削除するマクロ

  • エスケープキー で通常モードに切り替える

  • gg 入力で先頭行先頭文字列にカーソル移動
  • qd と入力し、マクロ名「d」でマクロの登録開始
  • 0 ゼロを入力し、カーソルを先頭に移動
  • 6x と入力し、カーソル位置の文字列を6回削除(スペースが削除される)
  • j と入力し、カーソルを下の行に移動
  • q と入力し、マクロ名「d」の登録を終了



  • マクロ名「d」を200回連続実行

200@d と入力すれば、全ての行の先頭スペースは削除される。



と、こんな風にマクロを使いながら編集作業の効率を上げられる。手作業でやるのとは大きな差が出ますね。



本番マクロ

ここから本番加工仕様のマクロを登録・実行します。



本番マクロの記録

まず、通常モードで gg と入力し、カーソルを先頭行の先頭文字列に移動させておきます。



次に、以下の操作手順をマクロに登録します。

  1. マクロ名 「a」とし、qa と入力するとマクロの記録が開始される。
  2. 0(ゼロ) を入力し、カーソルを先頭に移動させる。
  3. v/" (ブイは小文字) と入力し、先頭~最初の"までをビジュアル(矩形くけい)モードで選択し、エンターキーを押す。
  4. x(小文字) を入力する。矩形(くけい)の選択部分が削除される。
  5. /" を入力し、カーソルを最初の" に移動させる。エンターキーで確定。
  6. v/" (ブイは小文字) と入力し、エンターキーで確定。
  7. x(小文字) と入力し、矩形を削除。
  8. i(小文字) を入力し、挿入モードに切り替えたら ,(カンマ) を挿入する。
  9. ESC(エスケープ)キーを押し、通常(コマンド)モードに戻す。
  10. /" を入力し、" にカーソルを移動させる。エンターキーで確定。
  11. D(大文字) を入力し、カーソルの右側にある文字列を全て削除する。
  12. j を入力し、カーソルを下の行に移動させる。
  13. q を入力し、マクロの記録を終了する。


これでマクロ名「a」で作業が登録された。



本番マクロの実行

@aと入力し、マクロ名「a」の作業を実行する。上手く登録できていれば、カーソルのある行が一気にカンマ区切りの座標データに変わる。



5@a と入力すれば、マクロ「a」の作業が連続5回行われる。一気に5行が変換される。



200@a とか入力すれば、最終行まで一気に終わる。(使っているファイルは120行しかないので)



加工・変換し終えたファイルを保存する

:wq

上書き保存して終了。



おわりに

ある程度キレイに整っているテキストじゃないと、全ての行で同じ作業により加工するのは上手く行かないかもしれない。スペースが余分に入っているとか、ダブルクォーテーションが抜けているとか。
置換する方法の方が早くキレイに整形できるかな。



以上です。



【参考 関連】