LoginSignup
1
0

More than 5 years have passed since last update.

Swift で NextTrain 形式 (TBL 形式) をパースしてみた

Last updated at Posted at 2017-08-15

NextTrain形式

私が以前作成したWebアプリの「次のバスの発車時刻を表示・カウントダウンする HTML & Javascript の Webアプリ」http://qiita.com/ynomura/items/a406c9148fac3c7fc1e2 
では、独自のデータ形式を使用しておりましたが、広く使われているのは NextTrain形式(TBL形式) というもののようです。
http://office.toyolab.com/nexttrain/
ということで、上記のソースを TBL形式に対応しました。
さらに、iOS ネイティブアプリも視野に入れて、Swift でも書いてみようと思い立った。

Swift 3.0 でパースしてみる

この形式はテキストデータなので、これをテーブルデータにパースする処理を Swift で書いて見た。
使用環境は X-Code の Playground で、TBL形式データは外から読み込むのではなく、テスト用に行データの配列にしている。

ソース

実際のTBLデータは高機能で、備考など豊富なのだが、とりあえず、タイトル行(駅や路線名)と時刻データのみ処理するようにしている。
行き先や発駅などの備考データは読み飛ばすようにしている。

tblperce.swift
var inTbl = [ "# 盛岡",
             "e:A",
             "f:B",
             "8: 10 ef20 30 40 50",
             "9: 15 25 35 45 55",
             "10: 20 30 50",
             "23: 15 25 30" ]
var stName = ""
var bTbl:[Int] = []
var temp:[String] = []
var hh = ""
var mms:[String] = []
var mins:[String] = []

for rowData in inTbl {
    if rowData[rowData.startIndex] == "#" {
        stName = rowData.substring(from: rowData.index(rowData.startIndex, offsetBy: 2))
    } else {
        temp = rowData.components(separatedBy: ":")
        hh = temp[0]
        if !hh.isEmpty {
            if "0"..."9" ~= hh[hh.startIndex] {
                mins = temp[1].components(separatedBy: " ")
                for eachMin in mins {
                    mms = eachMin.components(separatedBy: CharacterSet.decimalDigits.inverted)
                    for mm in mms {
                        if mm != "" {
                            bTbl.append(Int(hh)! * 100 + Int(mm)!)
                        }
                    }
                }
            }
            // 備考の処理はしない
        }
    }
}
print(stName, bTbl)

最後の print 文の結果は

盛岡 [810, 820, 830, 840, 850, 915, 925, 935, 945, 955, 1020, 1030, 1050, 2315, 2325, 2330]

で、うまくいっているようです。

Swift の勉強を始めたばかりで、これで良いのか自信がありませんので、厚かましいとは思いますが、先輩諸氏の指摘など歓迎します!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0