pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


NextTrain形式の時刻表データを1行1情報に変換してみる

朝の通勤時にできるだけ混雑した電車を避けるために、最寄駅で乗る電車の編成や時刻を把握しておくことはとても大切なことかもしれません。

そして、最寄駅の上流側に車両基地があるようなケースでは時間帯により「途中駅からの始発電車」というラッキーなパターンに乗れる可能性があります。もしも上流側2駅くらいの範囲で始発で出る電車があるならば、その電車は確実に空いているでしょうから、それを積極的に狙いたくなります。しかしそのような分析に使える時刻表はなかなか見当たりません。

駅.Lockyのデータが使えないだろうか?

そんなときにふと思い出したのは駅.lockyという時刻表アプリ。このアプリでは時刻表データが利用者のボランティアベースでメンテナンスされているのですが、Q&Aの中に以下の案内があります。

■ 駅.Lockyで収集された時刻表データを他の時刻表アプリに入れて利用しても良いですか?
個人利用に限り、他のアプリで利用することができます。

というわけで、今回のケースも個人利用なのでOKの範囲と言える、と、多分思います。。。

さて、駅.Lockyの時刻表データは、NextTrain という形式が用いられています。この形式は NextTrain というフリーソフトウェアで用いられていたのですが、フォーマットがシンプルなことから時刻表表示アプリの多くでデファクトスタンダード的に使われています。

そして実際のデータ形式駅.Lockyの時刻表リストのページで確認できますが、ここではその形式を1行1情報の形式に変換してみることにします。

駅.Lockyのデータの中には、始発電車が明示されているものがありますので、そういうものを使えば、自分の最寄り駅、その上流側の駅のデータを1行1情報で比較できます。すると空いている電車の予測がつけやすくなります。

作ったスクリプト

gawk でこんなのを書いています。macOS の場合は brew などで gawk をインストールした上で、1行目の記述を #!/usr/local/bin/gawk -f のように書き換える必要があります。

#!/usr/bin/gawk -f
#
# nexttrain 形式のデータを
# 1行1情報に変換するスクリプト
#
# 例えば 駅.Locky の以下のデータを使うと...
# http://eki.locky.jp/site/list?pageid=tbl&code=237978
#
# こんな出力が得られる
# [MON][TUE][WED][THU][FRI]
# 新大阪・博多方面(平日)
# 06  06:00   ⑭のぞみ1号博多
# 06  06:16   ⑮のぞみ3号博多
# 06  06:20   ⑰のぞみ293号新大阪◆運転日注意
# 06  06:26   ⑯ひかり501号新大阪
# 06  06:30   ⑱のぞみ5号博多
# 06  06:33   ⑲こだま631号名古屋
# 06  06:43   ⑭のぞみ201号新大阪
# 06  06:50   ⑱のぞみ7号博多
# 06  06:56   ⑰こだま633号新大阪

BEGIN {
    # フィールドの区切りをデフォルトから変える
    FS="[:;\t ]*"
    destination_pattern=0
}

# 行き先や種別(各停、急行)から
# 置換用のマッピングを作る。
$1 ~ /^[a-zA-Z]/ {

    destination_char[destination_pattern] = $1
    destination_full[destination_pattern] = $2
    destination_short[destination_pattern] = $3
    destination_color[destination_pattern] = $4
    destination_pattern++

    next
}

# 駅名情報や曜日情報はそのまま出す
$1 ~ /^[#\[]/ {

    print
    next

}

# 時刻表情報を1行1情報に変換して出力する
{
    hour=$1

    # print $0
    # 行き先
    for ( i = 0 ; i < destination_pattern ; i++ ) {
        gsub( destination_char[i], destination_full[i], $0 )
    }

    # print $0
    for ( i = 2 ; i <= NF ; i++ ) {
        match($i, /([a-zA-Z]+?)([0-9]+?)/, timedetail)
        traintype=timedetail[1]

        min =substr( $i, match($i,/..$/) )
        dest=substr( $i, 1, length($i) - length(min))
        # printf "%d:%d ", i,NF
        printf "%02d\t%02d:%02d\t%s\n", hour, hour,min, dest
    }
    next
}