LoginSignup
20
18

More than 5 years have passed since last update.

CSV から構造化された JSON を生成するツールを Go で作った

Posted at

ゲームのマスターデータってだいたい CSV で書かれると思うんですが、それに一つツールを噛ませて、バリデーションもしつつプログラムで扱いやすいデータ構造にできたら便利かなと思って作ってみました(主に趣味プロジェクト用)。
名前はちょっと微妙かもしれない…

具体的には、

  • CSV のフラットな行データから構造化された JSON を生成したい
  • CSV ファイルのエンコーディングで CP932 とかいろいろ考慮しなくてもいいようにしたい
  • バリデーションしたい

上記の問題解決にフォーカスしたツールです(それ以外のことはやらない)。

インストール方法

リリースページ から実行ファイルをダウンロードするか、
Mac の人は Homebrew でインストールできます。

brew tap shiwano/formulas
brew install master

使い方

ヘルプテキストをべたり。

Usage:
  master [options] <file-or-directory>
  master -h | --help
  master --version

Options:
  -d, --output-directory string  Specify the output directory (default: <file-or-directory>).
  -s, --schema-directory string  Specify the JSON Schema directory (default: <file-or-directory>).
  -e, --encoding string          CSV file encoding [default: auto]. Supported encodings are https://goo.gl/T3zICN
  -E, --fix-encoding             Fix the CSV file encoding if it is different from --encoding.
  -n, --no-output-file           No file output. If file is given, print JSON string to stdout.
  -S, --output-schema            Output JSON schema from CSV files.
  -V, --skip-validation          Skip validation by JSON Schema.
  -h, --help                     Output help information.
  -v, --version                  Output version.

構造化フォーマット

ドット区切りで CSV のカラム名を指定すると、以下のようなルールで JSON にパースされます。

入れ子オブジェクトの場合:

user.id user.name
100 Alice
[
  { "user": { "id": 100, "name": "Alice" } }
]

配列の場合:

items.0 items.1 items.2
1 2 3
[
  { "items": [ 1, 2, 3 ] }
]

配列と入れ子のミックス:

users.0.id users.0.name users.1.id users.1.name
100 Alice 200 White Rabbit
[
  {
    "users": [
      { "id": 100, "name": "Alice" },
      { "id": 200, "name": "White Rabbit" }
    ]
  }
]

うちの会社で似たようなフォーマットで CSV 組んでて便利だったので、参考にさせていただきました。

バリデーション

生成された JSON バリデーションには JSON Schema を使います。foo.csv を変換する際に、
foo.schema.json が schema directory にないか探してきて、あったらそれをバリデーションに用います。
なかったらバリデーションしません。バリデーションに失敗したら、エラーで変換が止まります。

--output-schema オプションをつけると、CSV から JSON Schema のテンプレが生成されるので、
ゼロから作るのかったるいなと思った人はそれで作るとちょっと楽です。

エンコーディング

--fix-encoding オプションをつけると、CSV を変換する前にエンコーディングのチェックを行って、
--encoding オプションで指定されたエンコーディングと違ったら、正しいエンコーディングで
ファイルを上書きして直します。

UTF-8 の場合は、エクセルで読み込めるようにするために必ず BOM を付与するので、少し注意が必要です。

20
18
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
20
18