LEFログ

:smile

RustでCSVをJSONに変換するツールをリリースしました

概要

最近、Rustを使って、CSVJSONに変換するツールをリリースしました。

ctj - crates.io: Rust Package Registry

cargo install ctjですぐインストールして使うことができます。

2025-07-17現在のバージョンは0.1.8。ちょこちょこ機能を追加しています

このツールを作った理由について、簡単に書いてみたいと思います。

作った理由

一言でいうと、ヘッダ行がないCSVファイルにも対応をしたかったのが一番大きな理由です。他のツールを使うと情報が欠落することがありました。

また、CSVの真偽値や数値について、ツール側で文字列に変換されるのが困っていました。

具体的には…?

,b,
,,FALSE
,55.5,

このようなファイルがあったとき、別のツールを使うと次のような結果になります。

[
  {
    "": "FALSE",
    "b": ""
  },
  {
    "": "",
    "b": "55.5"
  }
]

大文字のFALSEがそのまま文字列として扱われています。また、55.5という数値も文字列になってしまっています。

真偽値と数値はそのままJSONで扱えるので、できればその型情報を識別し、同じように展開したいです。

それでは自分が新たに作成したツールを紹介しましょう。このctjを使うと、次のような結果になります。

[
  {
    "": false,
    "b": ""
  },
  {
    "": "",
    "b": 55.5
  }
]

FALSEfalseに、55.5は数値(float)として扱われます(小数点が無ければintegerとして処理されます)。

また、今回のCSVファイルはヘッダ行がありません。このような状況は実際にあり得ると思います。ヘッダ行がないと、情報の欠落が生じるリスクが高まります。

そのユースケースに対応するため、オプションを用意しました--no-headerをつけると、ヘッダ行がないことを ctj に伝えられるため、このように出力できます。

[
  {
    "column_0": "",
    "column_1": "b",
    "column_2": ""
  },
  {
    "column_0": "",
    "column_1": "",
    "column_2": false
  },
  {
    "column_0": "",
    "column_1": 55.5,
    "column_2": ""
  }
]

何列目にどの情報が入力されていたのか、すぐに把握できます。

無事に変換時の情報の欠落を防ぐという目的を達成することができました!

おわりに

あえて機能はシンプルにしつつ、実務に活かせるように設計してみました。すでにあるCSVファイルだけでなく、パイプで渡した文字列を処理することも可能です。

CSVJSONに変換するツールを探している方は、ぜひ使ってみてください。コントリビュートも歓迎です!

github.com