CSVをJSONに変換する方法
CSV(Comma-Separated Values)は表形式データの最もシンプルな形式で、どんな表計算ソフトでもエクスポートできます。JSON(JavaScript Object Notation)はWeb APIやモダンなアプリケーションの標準フォーマットです。両者の変換は、開発で最もよく行われるデータ作業の1つです。ブラウザベースのコンバーターは、データをサーバーにアップロードせずに、変換作業全体をローカルで処理します。
CSVからJSONへの変換が必要な場面
- Webアプリケーションへのデータ読み込み: ほとんどのJavaScriptフレームワークはCSVではなくJSONをネイティブに扱います
- APIペイロード: 表計算ソフトのデータをAPIエンドポイントに送る必要があるなら、JSON形式に変換する必要があります
- データベースへのインポート: 多くのNoSQLデータベース(MongoDB、Firebase)はJSONを直接受け付けます
- 設定ファイル: 設定値の表計算をJSON設定ファイルに変換する
- データ分析: エクスポートしたデータを、お使いのツールが処理できる形式に変換する
- GraphQLミューテーション: GraphQLエンドポイント経由で、表計算ソフトからレコードを一括挿入する
- テストフィクスチャ: 表計算ソフトのテストケースリストを、自動テスト用のJSONに変換する
- Webhookペイロード: サービスがJSONを期待するが、データが表計算ソフトにあるとき
- 国際化(i18n)ファイル: キーとロケール列を持つ翻訳の表計算が、JSONカタログになります
- レガシーシステムからの移行: 古いシステムはCSVをエクスポートすることが多く、新しいシステムはJSONを取り込むことが多い
- LLMへのデータ読み込み: 構造化されたJSONはCSVよりもChatGPTやClaudeにとって扱いやすい
CSVがJSONになる仕組み
CSVファイル:
name,age,city
Alice,30,New York
Bob,25,London
はJSONのオブジェクト配列になります:
[
{"name": "Alice", "age": "30", "city": "New York"},
{"name": "Bob", "age": "25", "city": "London"}
]
最初の行(ヘッダー)がキーになります。それ以降の各行がオブジェクトになります。
変換の手順
- CSVデータを貼り付ける: ヘッダー行のあるカンマ区切りデータを入力します。
- 区切り文字を選ぶ: カンマ、セミコロン、タブ、パイプから選びます。ほとんどの場合、ツールが自動検出します。
- コピーまたはダウンロード: JSON出力を確認し、クリップボードにコピーするか
.jsonファイルとしてダウンロードします。
CSVとJSONの簡単な歴史
CSVは何十年も古いフォーマットです。カンマ区切りのテキストという考え方は1960年代から1970年代に、メインフレームのプログラム間でデータを交換する方法として遡れます。IBM Fortran(1972年)はカンマ区切り出力を生成するリスト指向I/Oをサポートしていました。CSVは2005年のRFC 4180まで正式に標準化されませんでしたが、その時点ですでに数十億のCSVファイルが微妙なバリエーション(クォートルール、改行コード、エンコーディング)とともに存在していました。
JSONはずっと後にやってきました。Douglas Crockfordが2001年に仕様を定め、正式なRFC 4627が2006年、ECMA-404が2013年です。JSONはWeb向けに設計され、CSVはメインフレームでのバッチデータ処理向けに設計されました。両フォーマットには異なる強みがあります:
| 側面 | CSV | JSON |
|---|---|---|
| 構造 | フラットな表(行と列) | ネスト可能、階層的 |
| 型 | 型なし(すべてテキスト) | 型あり(string、number、bool、null、array、object) |
| ヘッダー | 最初の行を慣習的に使う | オブジェクトごとにフィールド名 |
| サイズ | 表データではコンパクト | 構造を含むため冗長 |
| ツール | Excel、すべての表計算ソフト | あらゆるモダンなプログラミング言語 |
| ストリーミング | 1行ずつ簡単 | デフォルトはファイル全体のパース(ただしJSON Linesも存在) |
| 厳格な仕様 | RFC 4180(2005年)、しばしば無視される | RFC 8259(2017年)、厳格 |
CSVからJSONへの変換は、本質的に行指向のフラットなデータからキー値オブジェクト記法への翻訳です。難しさのほとんどは、CSV仕様が予期しなかったエッジケース(クォートされた値、埋め込み区切り文字、UTF-8以外のエンコーディング)の扱いにあります。
厄介なCSVデータの扱い
クォートされた値: 値に区切り文字が含まれる場合(カンマを含む住所など)、二重引用符で囲む必要があります: "New York, NY"。優れたコンバーターはこれを正しく処理します。
空の値: 空のセルはJSONでは空文字列("field": "")になります。nullとして必要な場合は、出力を後処理する必要があるかもしれません。
数値: CSVにはデータ型がありません。すべてテキストです。JSON出力では数値が文字列(30ではなく"30")になります。アプリケーションで実際の数値が必要な場合は、変換後にパースしてください。
値の中の改行: 一部のCSVファイルには複数行の値(引用符で囲まれている)があります。すべてのコンバーターがこれを扱えるわけではないので、特定のデータでテストしましょう。
エスケープされた引用符: クォートされた値の中の引用符は、二重にすることでエスケープされます: "She said ""hello"""。ほとんどのパーサーはこれを正しく処理します。
末尾の空白: name ,age, cityのようなヘッダー内の余分なスペースは、汚いキーを作ります。優れたコンバーターはデフォルトでトリムし、空白を文字どおりに保持するものもあります。
バイトオーダーマーク: ファイルの先頭にあるUTF-8 BOMが、最初のヘッダーの先頭3文字として現れることがあります。一部のコンバーターはBOMを取り除き、そうでないものもあります。
異なる改行コード: WindowsのCSVファイルはCRLF、UnixはLF、古いMacはCRを使っていました。堅牢なパーサーは3つすべてを扱います。
出力フォーマットのバリエーション
CSV-JSONコンバーターはしばしば複数の出力オプションを提供します:
| 出力 | 例 | 最適な用途 |
|---|---|---|
| オブジェクトの配列 | [{"a":1},{"a":2}] | APIレスポンス、デフォルト |
| オブジェクトのオブジェクト(最初の列でキー化) | {"id1":{"name":"x"},"id2":{...}} | ルックアップテーブル、IDをキーとするレコード |
| 配列の配列 | [["a","b"],[1,2],[3,4]] | 順序を保持する生の行データ |
| 列指向 | {"a":[1,3],"b":[2,4]} | 統計分析(pandasとの相性が良い) |
| JSON Lines(NDJSON) | {"a":1}\n{"a":2} | ストリーミング、ログ処理 |
| ヘッダーでネスト | address.cityから[{"address":{"city":"NY"}}] | フラットなCSVからのネストデータ |
デフォルトはオブジェクトの配列で、ほぼすべてのWeb APIシナリオで動作します。JSON Linesは、何百万行もあってストリーミング処理が必要な場合に役立ちます。
型の推論
一部のコンバーターは型の推論を提供します:
- オフ(デフォルトで安全): すべての値が文字列。予測可能ですが、受信側のコードでのパースが必要です。
- 自動: 数値、真偽値、null、日付を検出します。
"30"が30に、"true"がtrueに、""がnullになります。便利ですが間違いが起きやすい("00525"のような郵便番号が525になる)。 - スキーマ駆動: JSON Schemaまたは列の型ヒントを与え、各列を指定された型に変換します。本番データに最適です。
データを管理している内部利用には、自動推論が時間を節約します。信頼できない入力には、型を文字列のままにして、コードで明示的にパースしましょう。
よくある落とし穴
- 先頭ゼロが失われる: 先頭ゼロを持つ電話番号、郵便番号、製品ID(
00525、09876)の列は、文字列として保持しないと数値になりゼロが失われます。これらの列をクォートするか、型推論を無効にしてください。 - Excelの数式インジェクション:
=で始まるCSV値(=SUM(...))はもともと表計算の数式でした。JSONへの変換ではリテラルなテキストを保持しますが、再度表計算にインポートすると数式が実行されます。ユーザーがアップロードするCSVでは、先頭の=、+、-、@を削除してください。 - エンコーディングの不一致: WindowsのExcelからエクスポートされたCSVは、UTF-8ではなくWindows-1252やLatin-1であることが多いです。非ASCII文字(アクセント、絵文字)は変換時に文字化けします。先にCSVをUTF-8として保存してください。
- 列数の不一致: 一部の行のフィールド数がヘッダーよりも多い、または少ない。厳格なパーサーは失敗し、寛容なものはパディングや切り捨てを行います。データの形状が一貫していることを確認してください。
- 重複するヘッダー:
name, name, ageは曖昧です。ほとんどのコンバーターは同名の最後の値のみを保持し、一部はname、name_2とします。元データで名前を変えてください。 - ドットや角括弧を含むヘッダー:
address.cityという列は、一部のコンバーターによってネストされたJSON({"address":{"city":...}})として解釈されることがあります。適切な出力モードを選んでください。 - 引用符の文字が混在: 一部のソースは、まっすぐな二重引用符の代わりに単一引用符やスマートクォート(カーリー)を使います。ほとんどのコンバーターはまっすぐな二重引用符を期待します。
- 末尾の改行:
\nで終わるCSVは、余分な空オブジェクトを生成することもあります。末尾の空白を取り除いてください。 - ヘッダー行がない: CSVにヘッダーがない場合、コンバーターは最初のデータ行をキーとして使うかもしれません(誤り)。ヘッダーを追加するか、配列の配列出力を使ってください。
- 非常に大きなファイル: 100 MBのCSVは200 MB以上のJSONを生成します。ブラウザのメモリが厳しくなります。大きなファイルには、JSON Lines(NDJSON)を使い、1行ずつ処理してください。
使いこなしのヒント
- ヘッダーを確認する: 最初の行はクリーンで一意な列名でなければなりません。スペース、特殊文字、重複ヘッダーは汚いJSONキーを作ります。
- 区切り文字を確認する: 欧州のCSVはカンマの代わりにセミコロンを使うことが多いです(多くの欧州諸国でカンマが小数点として使われるため)。変換結果がおかしく見えたら、別の区切り文字を試してください。
- 出力を整形する: 変換後、プロジェクトで使う前にJSONをフォーマッタにかけて読みやすくしましょう。
- 結果を抜き取り確認する: 多数の列があるファイルではとくに、JSON出力のいくつかの行を元のCSVと比較してマッピングが正しいことを確認してください。
- ExcelからUTF-8として保存する: Excelでは、エンコーディング問題を避けるため、プレーンな「CSV」ではなく「CSV UTF-8(コンマ区切り)」を選んでください。Apple NumbersとGoogle Sheetsはデフォルトで UTF-8です。
- 大きなファイルにはまずCSVリンターを使う:
csvlintやcsvkitのようなツールは、変換前に不正な行を検出します。 - 先にサンプル、後で変換: 50,000行のCSVには、まず最初の100行をテストとして変換し、出力の形状を検証してから残りを変換しましょう。
- 原本を保持する: 元のCSVを決して削除しないでください。JSONがおかしく見える場合、再処理のために原本が必要です。
- 深くネストされたデータには小さなスクリプトを書く: 1行のCSV-JSON変換は約80%のケースに合います。複雑なネスト(行ごとに項目の配列、条件付きフィールド)には、Pandas付きのPythonとカスタム変換の方が、どんな汎用コンバーターよりも柔軟です。
プライバシーと機密データ
CSV-JSONコンバーターは完全にブラウザ内で動作します。貼り付けたデータ、中間処理、出力JSONはすべてデバイス上に留まります。サーバーへのアップロード、ロギング、第三者との共有は一切ありません。
これは変換するCSVが機密データを含むことが多いからです。メールアドレスや電話番号を持つ顧客リスト、給与を持つ従業員レコード、金融取引、営業パイプラインデータ、マーケティングリード、内部の製品分析、EHRシステムからエクスポートされた医療記録、学生の成績、支払い履歴など。クラウド型のCSV-JSONコンバーターはすべての貼り付けをログに記録し、ときには「サービス改善」のために保持し、貼り付けられた顧客リストがログを監視する攻撃者に漏れた実際のデータ漏洩に関与してきました。ブラウザベースのコンバーターは露出ゼロで、データはマシンを離れません。
ブラウザベースの変換は、ページを一度読み込めばオフラインでも動作するため、飛行機の中、インターネットアクセスのないセキュアな環境、または顧客や財務データを第三者のサービスに貼り付けてはいけない場所でデータを処理するのに役立ちます。
よくある質問
ヘッダー行はどうなりますか?
最初の行はJSONオブジェクトのキーとして使用されます。後続の各行は、これらのキーを持つオブジェクトになります。例えば、ヘッダー「name,age」と行「Alice,30」は{"name":"Alice","age":"30"}になります。
どの区切り文字がサポートされていますか?
カンマ、セミコロン、タブ、パイプはすべてサポートされています。ツールは区切り文字を自動的に検出するか、手動で選択できます。
値内のカンマを処理しますか?
はい。二重引用符で囲まれた値(「New York, NY」など)は正しく処理されます, 引用符内のカンマは区切り文字ではなく、値の一部として扱われます。
データはサーバーに送信されますか?
いいえ。すべての変換はブラウザ内で行われます。データがデバイスを離れることはありません。