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データは高機能で、備考など豊富なのだが、とりあえず、タイトル行(駅や路線名)と時刻データのみ処理するようにしている。
行き先や発駅などの備考データは読み飛ばすようにしている。
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 の勉強を始めたばかりで、これで良いのか自信がありませんので、厚かましいとは思いますが、先輩諸氏の指摘など歓迎します!