読者です 読者をやめる 読者になる 読者になる

#24 ちょっと便利な変換ツールの紹介

この記事は tech.kayac.com Advent Calendar 2013 24日目の記事となります

いよいよ、Advent Calendarも最終日ですね。人生を考えてしまう、不惑が目前となってきた@takihitoです。 「不惑の心構え」 について書きたいところですが、そこは孔子専門家に譲ることにして、今回はちょっと便利な自作ツ ールの紹介したいと思います(訂正:社内にいるのは老子の専門家とのことです、ごめんなさい;;)

APIレスポンスのJSONモックを作る際、Keyが多いと面倒だったりしますよね。 DBとテーブルが既にある場合、tsv2jsonを使うとカラムをキー名としたJSON形式に変換することが出来ます

$ mysql -u root game -e "select id,price,exp from monster limit 3" | tsv2json
[{"exp":"200","price":"150","id":"1"},{"exp":"200","price":"150","id":"2"},{"exp":"200","price":"150","id":"3"}]

DBにクエリを発行するとTSV形式のデータが返ってくるので、それを直接JSON形式に変換といった感じですね。 -n オプションを を付けることで値の形式を文字列から数値型に変更することも出来ます

$ mysql -u root game -e "select id,price,exp from monster limit 3" | tsv2json -n id,exp
[{"exp":200,"price":"150","id":1},{"exp":200,"price":"150","id":2},{"exp":200,"price":"150","id":3}]

csv2jsonもあるので、Excel→CSVにしてCSVファイルから変換することもできます。 xxx2xxx系のツールはネットのあちこちに落ちていたりもしますが、この程度であれば自作し手元に用意していてもいいですね。

jqを使ってみる

JSONといえば、 jqコマンドですね。絞り込みや成形を行うことが出来ます。

idが2以上のデータだけを表示させるにはこんな感じで。mapでリストをなめながら、selectの条件に一致する要素だけを絞り込みます。

$ mysql -u root bushiroadkr -e "select id,price,exp from monster" | tsv2json -n id,exp | jq "map(select(.id >= 2 ))"
[
  {
    "id": 2,
    "price": "150",
    "exp": 200
  },
  {
    "id": 3,
    "price": "150",
    "exp": 200
  }
]

SQLで条件書けば良いだけの話かもしれないですが、ファイルとして手元に落とした後でも、お手軽に絞り込めて重宝だったりします。

そういえば、今年はLTSV元年でした。社内の新規案件では、LTSV形式のログを吐き出す事が多くなってきています。 ltsview は-jオプションを使うことでjson形式で成形し吐き出すことが出来ます。

# レスポンスタイム0.5sec以上のログ
$ cat access_log.ltsv | ltsview -j | jq 'select( .response_time | tonumber >= 0.5 )'

ただし、lstviewだと行ごとの成形になるので、グループ分けしたい時にはちょっと不便なので自作のltsv2jsonを使ったりしています。

# URL毎に分類
$ cat access_log.ltsv | ltsv2json | jq 'group_by(.uri)' 

[
  [
    {
      "status": "200",
      "response_time": "0.028",
      "uri": "/api/mypage",
    },
    {
      "status": "200",
      "response_time": "0.033",
      "uri": "/api/mypage",
    },
  ],
  [
    {
      "status": "200",
      "response_time": "0.099",
      "uri": "/api/paly",
    },
# レスポンスタイム0.5sec以上のログ
$ cat access_log.ltsv | lstv2json -j | jq 'map(select( .response_time | tonumber > 0.5 ))'

他にも

  • csv2perl

csvをperlのデータオブジェクトに変換、ファイルに落とせばdoして取り込む事ができるので、スクリプトで集計処理する時には便利ですね

  • json2yaml

YAMLの形式がイマイチよく分からないとお悩みの方は、JSON形式で書いてjson2yamlで形式変換するとスッキリ解決しそうです

まとめ

さて、Advent Calendar 2013 はいかがだったでしょうか? 様々な職種、退職者の方もいたりして大変オープンな雰囲気が伝わっていただけたら幸いです。

香盤表では25日の欄があったので、トリではないと油断していたのですが 「 普通は24日までだよね」という空気になり、小ネタで25日にパスしようとした目論見が外れた感じです。 なかなか人生思い通りにならなうものですな

それでは、また来年のAdvent Calendarでお会いしましょう。