CSV vs JSON vs XML:適切なデータフォーマットの選び方
すべてのデータ交換にはフォーマットの選択が必要です。CSV、JSON、XMLは最も一般的な3つのオプションで、それぞれ異なる強みを持っています。間違ったフォーマットを選ぶとパースの問題、肥大したペイロード、開発時間の浪費につながります。このガイドは適切なツールの選択を支援します。
フォーマットの概要
CSV(カンマ区切り値)
name,age,city
Alice,30,London
Bob,25,Paris
Charlie,35,Tokyo
- 構造:フラットな表形式(行と列)
- 型システム:なし(すべてがテキスト)
- ネスト:非対応
- サイズ:表形式データで最小
JSON(JavaScript Object Notation)
[
{"name": "Alice", "age": 30, "city": "London"},
{"name": "Bob", "age": 25, "city": "Paris"},
{"name": "Charlie", "age": 35, "city": "Tokyo"}
]
- 構造:階層的(オブジェクト、配列)
- 型システム:文字列、数値、ブール、null、オブジェクト、配列
- ネスト:ネイティブサポート
- サイズ:中程度
XML(eXtensible Markup Language)
<people>
<person>
<name>Alice</name>
<age>30</age>
<city>London</city>
</person>
<person>
<name>Bob</name>
<age>25</age>
<city>Paris</city>
</person>
</people>
- 構造:属性と要素を持つ階層構造
- 型システム:XML Schema(XSD)経由
- ネスト:ネイティブサポート
- サイズ:最大(冗長なタグ)
詳細比較
| 特徴 | CSV | JSON | XML |
|---|---|---|---|
| 可読性 | 高い(表形式) | 高い | 低い(冗長) |
| ファイルサイズ | 最小 | 中 | 最大 |
| パース速度 | 最速 | 速い | 最遅 |
| ネスト | 不可 | 可能 | 可能 |
| スキーマ | 標準なし | JSON Schema | XSD、DTD |
| コメント | 不可 | 不可 | 可能 |
| メタデータ | 不可 | 不可 | 可能(属性) |
| ストリーミング | 行単位 | SAX/ストリーミング | SAX/StAX |
| バイナリデータ | 不可 | Base64文字列 | Base64またはCDATA |
| 名前空間 | 不可 | 不可 | 可能 |
CSVの使用場面
最適な用途:
- スプレッドシートデータとデータベースエクスポート
- データ分析(Pandas、R、Excel)
- 一貫した列を持つシンプルなフラットデータ
- 最大の互換性(すべてのツールがCSVをサポート)
- サイズが重要な大規模データセット
避けるべき場面:
- ネストされた階層構造を持つデータ
- 複数のデータ型を保持する必要がある場合
- 列の値にカンマ、改行、クォートが含まれる場合(エッジケース)
CSVエディターでCSVデータを操作するか、CSV to JSONコンバーターでJSONに変換できます。
JSONの使用場面
最適な用途:
- Web API通信(REST、GraphQLレスポンス)
- 設定ファイル(package.json、tsconfig.json)
- ドキュメント指向データベース(MongoDB、CouchDB)
- ブラウザ環境(ネイティブJavaScriptパース)
- 構造が可変のデータ(一部のレコードにのみフィールドがある)
避けるべき場面:
- データが純粋な表形式の場合(CSVの方がシンプルで小さい)
- XMLの機能が必要な場合(名前空間、スキーマ、XSLT)
- データファイルにコメントが必要な場合(代わりにYAMLを使用)
JSONフォーマッターでJSONをフォーマットおよび検証できます。
XMLの使用場面
最適な用途:
- エンタープライズシステム(SOAP、XHTML、RSS、SVG)
- ドキュメントマークアップ(混在コンテンツ — 埋め込み構造を持つテキスト)
- 要素と並んで属性が必要な場合
- 強力なスキーマ検証要件(XSD)
- XSLT変換
- 業界固有の標準(医療のHL7、金融のXBRL)
避けるべき場面:
- モダンWeb APIの構築(JSONが標準)
- データが表形式の場合(CSVの方がシンプル)
- ファイルサイズとパース速度が重要な場合(JSONの方がスリム)
サイズ比較
同じ1000レコードのデータセット:
| フォーマット | ファイルサイズ | パース時間(相対) |
|---|---|---|
| CSV | 45 KB | 1x(ベースライン) |
| JSON | 85 KB | 1.5x |
| XML | 140 KB | 3x |
XMLの冗長性 — 開始タグ、終了タグ、すべての値で繰り返される要素名 — はCSVと比較してサイズを約3倍にします。
マイグレーションパターン
CSVからJSON
import csv, json
with open('data.csv') as f:
reader = csv.DictReader(f)
data = list(reader)
with open('data.json', 'w') as f:
json.dump(data, f, indent=2)
JSONからCSV
import csv, json
with open('data.json') as f:
data = json.load(f)
with open('data.csv', 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=data[0].keys())
writer.writeheader()
writer.writerows(data)
XMLからJSON
import xmltodict, json
with open('data.xml') as f:
data = xmltodict.parse(f.read())
with open('data.json', 'w') as f:
json.dump(data, f, indent=2)
モダンなランドスケープ
過去10年のトレンドは明確です:JSONはWeb APIと設定においてXMLを大きく置き換えました。しかし、分析やビジネスの文脈でのデータ交換ではCSVが依然として主流であり、XMLはエンタープライズおよび政府システムで存続しています。
新しい代替手段:
- YAML:人間に優しい設定(JSONとXMLの両方の設定を置き換える)
- Protocol Buffers / MessagePack:高性能システム向けバイナリフォーマット
- Parquet / Arrow:ビッグデータ分析向けカラムナーフォーマット
JSONとYAMLの比較についてはYAML vs JSONガイドをご覧ください。
FAQ
これらのフォーマット間で変換してもデータは失われませんか?
CSVからJSONへの変換はフラットデータに対してはロスレスです(ただし型は失われます — CSVでは数値が文字列になります)。JSONからCSVへの変換では階層構造が失われます(ネストされたオブジェクトはフラット化が必要)。XMLからJSONへの変換はほぼロスレスですが、属性と混在コンテンツは扱いが難しい場合があります。特定のデータで往復変換を必ずテストしてください。
新しいAPIにはどのフォーマットを使うべきですか?
JSONです。ネイティブなブラウザサポート、優れたツール、可読性とサイズの最適なバランスを持つ、モダンWeb APIのデファクトスタンダードです。検証にはJSON Schemaを使用してください。唯一の例外は、XMLを要求するレガシーエンタープライズシステムとの統合の場合です。
関連リソース
- CSVエディター — CSVデータの編集とクリーニング
- JSONフォーマッター — JSONのフォーマットと検証
- CSV to JSON変換ガイド — ステップバイステップの変換