はじめに
DQ10ネタをくれた知人から「コインボスを初めて倒した日を知りたい」と言われたので「コインボスってなーに?」って返したら、「アトラスとかバズズとか」など懐かしい単語が出てきたのでやってみた。
やってみた
コインボスのリストを貰ったのでルックアップで取り込んみ、ボス名でログ(日記)と突き合わせて日付を出せばいいだろう・・・と思ったのだが、「コインボスを倒していない」場合があるようなので、ログ→ルックアップの順で連結すると、倒していないボスが抜けてしまうことになる。なので、逆にルックアップ→ログの順に連結することにした。
| inputlookup dq10_coinboss
| join boss type=left [search index="XXX" host="YYY" msg="*をはじめて倒した!" | rex field=msg "^(?P<party>.*)と(?P<boss>.*)をはじめて倒した!"
| replace "べリアル" with "ベリアル" in boss
| eval date2 = _time | table boss, date2]
| eval date1=strptime('date', "%Y/%m/%d")
| eval difftime=if(date2!="", round((date2-date1)/60/60/24,0), round((now()-date1)/60/60/24,0))
| eval date2 = strftime('date2', "%Y/%m/%d")
| fields boss,date,date2,difftime
| sort - date
| rename boss AS "ボス名", date AS "実装日", date2 AS "初撃破", difftime AS "間隔"
ルックアップ→ログ連結
コインボスリストは「date(実装日),boss(ボス名)」のCSVファイルだったので、joinコマンドでbossを渡してログを検索。このとき「リストにあるけどログにない(倒していない)」場合も残したいので、type=leftを指定した。
日記から抽出
joinでつないだ先は[]で囲ってsearchからスタート。
msgが「をはじめて倒した!」で終わるものだけ一旦抽出し、rexコマンドでboss名をさらに抽出。その時の_timeをdate2に代入して撃破日を記録。
実装日から何日後に倒したか
コインボスとやらはたまに追加される代物らしく、追加されてもすぐ倒せるものではないらしい。ということで撃破日-実装日=間隔を求めると、どれくらい経ってから倒したのがわかるのでちょっと面白いのではないかと。
実装日(date)をstrptimeでUNIX通算秒に変換してdate1に代入。
date1がNULL=まだ倒していない場合を考慮し、if文で分岐させて倒していればdate2-date1を、倒していなければnow()-date1を求め、さらに60/60/24してround()で丸め処理をして日数に変換した。
整形
最後に実装日でソートし、ボス名、実装日、撃破日、間隔にリネームして完成!
ベリアルを倒していない?
出来たー、と思ったのだが、キャラ(数キャラ分日記を入れた)によっては3番目に実装された「ベリアル(DQ2に出てきた黄色いやつですな)」が「倒していない」ことになるのだ。知人に聞いたら「倒していないわけない」と言うし、全部そうなら何かミスってると思うのだが、キャラによって出たり出なかったりというのはどういうことだ?
確かに日記を「ベリアル」でサーチすると、あるキャラだけ倒したログが見つからない。
ところが何となく「リアル」でサーチしたら、あるキャラもベリアルを倒したログが出てくるのだ。
え?
まさか?
「ベリアル」ではなくて「べリアル」になっていることが判明!!
字面だけ見ていると何言ってるのかよくわからないと思うが、「ベ(カタカナ)」ではなく「べ(ひらがな)」なのである。確認のため、本元のHPの日記の該当箇所をコピペしてよーく見比べてみても、やっぱり「ベ(カタカナ)」ではなく「べ(ひらがな)」なのである。つまり元のデータが悪いのだwww
※ちなみに全体を見直しみたら「キャロルべリアル」なる敵も「べ(ひらがな)」であった・・・
仕方ないので、replaceコマンドで「べリアル」は「ベリアル」に置換するようにした。これもデータクレンジングの1つなのか・・・。
完成
気づきとまとめ
・inputlookup・・・ルックアップからデータを読み込む。
・join・・・サーチとサーチを特定のフィールドで繋ぐ。typeはinner,left,outer。
・replace・・・フィールドの値を置換する。値A with 値B in フィールド名。
・rename・・・フィールド名を変換する。フィールド名A AS フィールド名B。
・round(A,B)・・・数値Aを桁数Bで四捨五入する。B=0が1の位、正数が小数点第n位を意味するので、負数が1の位より上の位になる(-1は10の位)
・strftime(sec,"%Y/%m/%d")・・・UNIX通算秒(sec)を指定した時間形式の文字列に変換する
・_timeをrenameするとUNIX通算秒で表示されてしまうのでstrftime()で変換すること