BTW TOOLS

BTW TOOLS

Web制作・開発の小さな手間を、ちょっと楽にするツールたち。

CSV ⇔ JSON 変換

CSV と JSON を相互変換。引用符・改行を含むセルや区切り文字の自動判別に対応し、ヘッダー行の扱い・型変換・空欄の扱いを選べます。すべてブラウザ上で動作。

型変換は既定でオフです。オンにすると 0123 のような先頭ゼロの値や、桁の大きい数字が壊れる場合があります(郵便番号・電話番号・商品コードなど)。

ヒント: 変換はすべてブラウザ内で行われ、貼り付けたデータがサーバーに送信されることはありません。
このツールを共有

使い方・詳細情報

このツールでできること
  1. CSV → JSON: 表計算ソフトから書き出した CSV を、API やコードで扱える JSON に変換します。1行目を見出しとして使えば [{"列名": "値"}] の形になります。
  2. JSON → CSV: オブジェクトの配列を表形式にして、Excel や Google スプレッドシートで開ける CSV にします。
引用符・改行を含むセルの扱い

CSV の解析は RFC 4180 に従います。引用符で囲まれたセルの中では、区切り文字も改行もそのまま値として扱われ、連続する2つの引用符 "" は1つの引用符になります。

name,memo\n"佐藤, 花子","改行を\n含むメモ"

出力側も同じ規則で、値に区切り文字・引用符・改行・前後の空白が含まれる場合だけ引用符で囲みます。単純な文字列分割では壊れるデータも、そのまま往復できます。

型変換をオフにしている理由

「数値・真偽値を型変換する」は既定でオフです。オンにすると "30"30 に、"true"true になり JSON として自然になりますが、次のような値が壊れます。

  • 先頭ゼロ: 郵便番号 0123、商品コード 007
  • 桁の大きい数字: 16桁を超える ID は精度が落ちて別の数値になる

このツールでは、オンにした場合でも元の表記に戻せる値だけを変換します。「数値にしてから文字列に戻したとき、元と一字一句同じになるか」で判定するので、先頭ゼロ 0123・桁あふれする ID・指数表記 1e3・末尾ゼロ 1.50 はいずれも文字列のまま残ります。とはいえ意図しない変換を避けたい場面が多いので、必要なときだけオンにしてください。

エラーにする CSV / 通す CSV

エラーにするのは「引用符で囲まれたセル」の解釈が確定しない場合だけです。「読めるが整っていない」データは通し、「読めていない」データは止める、という分け方をしています。

エラーにする(値が黙って変わってしまうため)

  • 引用符が閉じていない: 1,"two のまま終わると、後続の行がまるごと1つのセルに吸い込まれ、行が静かに消えます
  • 閉じた引用符の後に文字が続く: "two"x は通すと引用符を捨てた twox になります。閉じ引用符の後に置けるのは区切り文字か改行だけです

通す(値の解釈が一意に決まるため)

  • 列数が揃っていない: 不足を空欄で補い、警告で知らせます
  • 囲んでいないセルの中の引用符: 5" x 7"t"wo はそのままの文字として扱います。厳密には RFC 4180 に反しますが、インチ記号のように実データで普通に現れる書き方で、値の読み方に迷いがありません。Excel や Python の csv モジュールなど一般的な実装も同じくそのまま読みます
2^53 を超える整数(64bit ID)

JSON → CSV では、9007199254740993 のような 253 を超える整数が読み込みの時点で丸められます(この例では …992 になります)。JavaScript の数値がそこまでしか正確に表せないためで、このツールに限らず JSON を扱うすべての実装で起きます。

丸めは JSON.parse() の時点で起きるため、読み込んだ後の値から元の桁を復元することはできません。そこで本文を直接調べて、丸められた整数があれば警告します。データベースの ID やスノーフレーク ID を扱うときは、JSON 側で "9007199254740993" のように文字列にしてください。文字列なら桁数に関係なくそのまま通ります。

行数×列数の上限

「列はすべてのキーの和集合にする」をオンにしたまま行ごとにキーが違う JSON を渡すと、列が行数ぶんまで増えます。1万件がそれぞれ固有のキーを1つ持つデータは、入力が 120KB 程度でも 1億セルの表に展開され、ブラウザが固まります。

そのため 行数×列数が100万セルを超える場合はエラーにしています。この形のデータは「列はすべてのキーの和集合にする」をオフにすると、先頭のオブジェクトのキーだけが列になり通ります。

列数が揃っていない CSV

行ごとに列数が違っても変換は止めません。見出しより少ない行は空欄で補い、多い行は余りを切り捨てたうえで、どの行が何列だったかを警告として表示します。実データは不揃いなことが多いため、エラーで止めるより通して知らせるほうが実用的だと考えています。

見出しに同じ名前が複数あるときも警告します(JSON のキーは重複できないため、後の列の値で上書きされます)。

ネストしたデータの扱い

JSON → CSV で値がオブジェクトや配列だった場合は、JSON 文字列のまま1つのセルに入れます{"a":1} はそのまま {"a":1})。a.ba[0] のような列名に展開(フラット化)はしません。列名の規則が増えると、どんな CSV になるか予測しづらくなるためです。

列は既定ですべてのオブジェクトのキーの和集合です。オブジェクトごとにキーが違うデータでも、どれかに存在するキーはすべて列になります。

信頼できないデータを表計算ソフトで開くとき

表計算ソフトは、セルの値が = + - @ で始まると数式として解釈します。他人から受け取ったデータや外部 API のレスポンスを CSV にして開く場合、悪意のある値が数式として実行されるおそれがあります(CSV インジェクション)。

このツールは値を書き換えずそのまま出力します。変換前後で値が一致することを保証するのが役目なので、勝手に ' を付けるような加工はしません。裏を返すと、危険な値もそのまま通ります。

信頼できない出所のデータを Excel や Google スプレッドシートで開くときは、ファイルを直接開かず「データ」→「テキストから」でインポートし、対象の列を「文字列」に指定してください。この方法なら数式として評価されません。

文字コードと Excel で開くとき

ダウンロードする CSV には BOM 付き UTF-8 を使っています。BOM が無いと Excel が Shift_JIS と解釈して日本語が文字化けするためです。読み込み時は、貼り付けたテキストの先頭に BOM があっても取り除いてから解析します。

データの安全性について

このツールはすべての変換をブラウザ(JavaScript)上で行います。貼り付けたデータがサーバーへ送信・保存されることは一切ありません。ネットワークを切断した状態でも動作します。顧客名簿のような機微なデータの変換にも使えます。

REQUEST · FEEDBACK

「こんなツールがあったら…」
気軽にリクエストしてください

実装可能なものから順次対応します。不具合の報告や改善のご意見もぜひ。