📑

CSVをJSON Linesに変換するCLIツール「cj」を作った

2024/12/13に公開

CSVをJSON Linesに変換するCLIツールを作りました。

https://github.com/musou1500/cj/

リリースページで実行ファイルを配布しているので、パスの通った場所に置くだけですぐに使えます。

どんなことができるか

CSV形式のデータをJSON Lines形式で出力することができます。
必要に応じてA1 notation風の表記でカラムを絞り込むことも可能です。
下記のようにとてもシンプルで使いやすく、私自身も重宝しています。

$ cat input.csv
A,B,C,...,Z,AA,AB,AC
0,1,2,...,25,26,27,28

# CSVファイルをJSON Linesに変換する
$ cj input.csv > output.jsonl
["A","B","C",...,"Z","AA","AB","AC"]
["0","1","2",...,"25","26","27","28"]


# 標準入力からCSVを読み込んでJSON Linesに変換する
$ cj < input.csv > output.jsonl
["A","B","C",...,"Z","AA","AB","AC"]
["0","1","2",...,"25","26","27","28"]

# A1 notation風の表記で選択したカラムをJSON Linesに変換する
$ cj -s A:B,D:E input.csv > output.jsonl
["A","B","D","E"]
["0","1","3","4"]

背景

業務で利用するシステムを開発する中で、ビジネスサイドからの依頼でスプレッドシートのデータを取り扱うことが多くありました。例えば、スプレッドシートで管理しているデータをシステムに移行する、といった作業はよく発生します。

特に、システム導入時に一度だけ行いたい、というような依頼は多く、頻繁に発生しないため機能化も検討しづらいことが多くありました。
そのような場合、処理しやすさのためスプレッドシートからCSV形式でエクスポートして扱うことが多いのですが、下記のような課題がありました。

  • シェルでサクッと処理したいのに、ちょうどいいツールがない
    • CSVを扱うCLIツールの選択肢はいくつかあるが、細かいユースケースを押さえるためにドキュメントを読み込むのが面倒
    • そもそも取り扱いやすい形式に変換さえできれば、あとは使い慣れたツールで処理できるので多くの機能は求めていない
  • CSVの各行を配列として扱う際、A1 notationから対応するインデックスへの変換が面倒
    • ライブラリの便利機能を使うにせよ、渡されたデータがプログラムで処理しやすい形式になっていることの方が少なく、データの整形にも一手間かかる

そんな課題から生まれたのがCLIツール 「cj」です。

どんなところが便利なのか

このツールはとてもシンプルです。
実際、オプションはカラムを絞り込む -s しかなく、CSV形式のデータをJSON Lines形式で出力する機能だけしか持っていません。
しかし、cjは以下のような点が優れています。

  • 覚えることが少ない
    • JSON Linesに変換した後にどうするかは他のツールに委ねているので、仕様がシンプルです
  • A1 notation風の表記でカラムを指定できる
    • スプレッドシートからエクスポートしたデータを楽に取り扱うことができます
  • シングルバイナリですぐ使える
    • パスの通った場所に置くだけでよく、インストールが楽です
  • 他のCLIツールとの相性が良い
    • 特に jq との相性は抜群です
    • 行単位の出力であるため、枯れたCLIツールとの相性も良いです

いくつか実践的な使用例を示してみます。

# 最初の1行を読み飛ばす
$ cj ./data.csv | tail -n +1

# AB列にユーザの年齢が記載されたCSVファイルから、成人済みのユーザ数を数える
$ cj -s AB ./data.csv | jq '.[0] | select(. >= 20)' | wc -l

# クリップボードにコピーしたcsvからコマンドを生成して実行
# (列挙されたユーザ一覧をシステムに登録するケースを想定)
$ xsel --clipboard --output | cj | \ 
    jq -r '"npm run add-user -- \(.[1]) \(.[0])"' | sh

特に出力が行単位であり、他のCLIツールとの相性が良い点が想像以上に便利で、「ひとつのことをうまくやる」という考え方の威力を痛感しています。
また、他のCLIツールとの相性が良いということは、手に馴染んだツールを最大限活用できる、ということでもあります。学習コストがかなり低く済むのは嬉しい点です。

まとめ

cjは、CSV形式のデータをJSON Linesに変換して出力するツールです。シンプルな使い心地で、新しく覚えることはほとんどありません。
(実際、冒頭の例で使い方に関するほとんどの説明は済んでしまいます)

インストールも容易で、特定のツールを必要としません。リリースページで配布されている実行ファイルをパスの通った場所に置くだけで良いです。

また、JSON Linesへの変換以外の仕事はほぼしないため、その他の処理には使い慣れたツールを活用できます。

ぜひ一度試してみてください。

https://github.com/musou1500/cj/

Discussion