Posted at

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

More than 3 years have passed since last update.

https://github.com/shiwano/master

ゲームのマスターデータってだいたい 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 を付与するので、少し注意が必要です。