コンテンツへスキップ

CSVをJSONに変換

CSVファイルや貼り付けた表を、きれいなJSONにします。数値と真偽値は型付きで、ドット付きの見出しからネストしたオブジェクトを組み立て、コードが求めるとおりの形で出力します。

  • 保存しません
  • 順番待ちなし
  • 登録不要・透かしなし

使い方

1

CSVを追加

.csvか.tsvファイルをドロップするか、データを貼り付けます。区切り文字と文字コードは自動で判別されます。

2

形を選択

オブジェクトの配列、配列の配列、1列目をキーにしたオブジェクト、JSON Linesから選び、型、空の値、インデントも設定します。

3

コピーまたはダウンロード

JSONをクリップボードにコピーするか、.jsonファイルとして保存します。

CSVが見た目よりあいまいなところ

CSVには本当の意味での標準規格がありません。2005年に作られた、多くのツールの動作を記述した参考仕様はありますが、それとは違う動作をするソフトウェアが大量にあります。そこで最初の仕事は、ファイルの実態を見極めることです。値がカンマ、セミコロン、タブのどれで区切られているか(ヨーロッパのロケールではセミコロンで書き出されます。カンマが小数点だからです)、1行目が見出しかどうか、引用符がどう扱われているか。引用符で囲んだ項目には、カンマ、改行、二重にした引用符を正当に含めることができます。だからこそカンマで分割する読み方は誤りで、素朴なパーサーは住所を含むファイルをどれも壊してしまうのです。

型が2つ目の仕事で、JSONにはCSVにはないこだわりがあります。CSVのセルに入っているのはテキストだけですが、JSONは数値、文字列、真偽値、nullを区別します。どれがどれかを何かが判断しなければならず、重要なのは誤りやすい判断です。郵便番号、電話番号、口座番号では先頭のゼロに意味があるため、01234のような値は数値の1234にせず、文字列のまま残さなければなりません。長い識別子も同じで、JSONの数値ではおよそ9000兆を超えると精度が失われます。

JSONには日付型がないので、日付は元のテキストのまま残ります。2024-03-05は文字列"2024-03-05"として出力されます。これは制限ではなく誠実な答えです。ほかの選択肢は推測であり、推測こそが03/05/2024をある国では3月に、別の国では5月にしてしまう原因です。日付の変換は、自分が求める形式を知っているJSONの利用側が決めることです。

文字コードは、最後の静かな落とし穴です。CSVは自身の文字コードを記録しないため、Windows-1252で保存したファイルをUTF-8として読むと、アクセント記号付きの名前を含む行だけがちょうど文字化けします。また、Excelが先頭に付けるバイトオーダーマークは、正しく処理しないと最初の項目名に余計な文字として現れます。どちらも変換ツールではなく、CSVという形式の性質です。

ほかの目的には

メモリに収まらないほど大きなファイルや、スクリプトで処理するものには、専用に作られたcsvkitがあります。csvjson --stream data.csvは少しずつ変換し、csvlookで先に中身を確認でき、csvcleanは後工程をすべて壊す不揃いな行を修正します。Miller(mlr --icsv --ojson cat data.csv)も同じことをかなりの速さで行い、ほとんどのデータパイプラインが実際に求める行区切りのJSONにも対応しています。

手軽さより型が重要なときは、型を推測させるのではなく宣言して、コードで変換しましょう。Pythonのpandasでdtypeの対応を明示するか、スキーマ付きの小さなスクリプトを書けば、郵便番号は郵便番号のまま、識別子はすべての桁を保ったままになります。全体を見ていないファイルに対して、自動の推測ではこれを保証できません。

よくある質問

どのJSONの形を選べばいいですか?

オブジェクトの配列([{"name": "Ada", "age": 36}])は、ほとんどのAPIやライブラリに合います。配列の配列は最もコンパクトです。キー付きのオブジェクトなら、コードからIDでレコードを引けます。JSON Linesは1行に1レコードを置く形で、ストリーミング処理のツール、BigQuery、ログのパイプライン向けです。

数値と真偽値はどのように決まりますか?

列ごとに1回判定します。列が数値になるのはその列のすべての値が数値の場合だけなので、1つのキーの下に"007"と7が混在することはありません。先頭にゼロが付いた値や、JavaScriptで正確に保持できないほど長いIDは文字列のまま残します。trueとfalseは真偽値になり、空のセルはnullになります。お好みで空文字列にしたり、省いたりすることもできます。

ネストしたJSONを作れますか?

はい。ネストをオンにすると、address.cityのような見出しは{"address": {"city": …}}になり、tags.0、tags.1は配列になります。

データはどこかに保存されますか?

いいえ。どこにも送信されず、何も保存されません。

セミコロンやタブ、ほかの文字コードは?

カンマ、セミコロン、タブ、パイプは自動で判別し、UTF-8、UTF-16、古いWindowsの文字コードも同様に判別します。そのため、アクセント記号付きの文字やラテン文字以外のテキストも崩れずに変換されます。

列名が重複していたり空だったりする場合は?

重複した列名には番号を付け(name、name_2)、空の見出しには位置に基づく名前(column_3)を付けます。そのため値が上書きされることはなく、何を変更したかもお知らせします。

ご注意: JSONには日付型がないため、日付はファイル内のテキストのまま残ります。非常に大きなファイルは、ブラウザのメモリに左右されます。

このツールをあなたのサイトに設置

ブログ、授業のページ、ヘルプ記事などに無料で設置できます。コードを1つ貼り付けるだけで、訪問者がそのページ上でツールを使えるようになります。