CSVからJSONへの変換は、開発者が日常的に直面する最も一般的なデータ変換タスクの一つです。システム間のデータ移行、API構築、スプレッドシート処理など、CSVをJSONに変換する方法を効率的に知ることは不可欠です。この包括的なガイドでは、変換ツール、解析アルゴリズム、JavaScript、Python、Bashのコード例、エッジケースのベストプラクティスをカバーします。
無料オンラインCSV to JSON変換ツールをお試しください。
CSVとは?
CSVはComma-Separated Values(カンマ区切り値)の略で、RFC 4180で定義された表形式データを格納するプレーンテキストファイル形式です。各行はレコードを表し、値はカンマや他の区切り文字で区切られます。最初の行は通常ヘッダーとして機能します。
CSV形式はコンピューティングの初期から使用されており、そのシンプルさから今も人気があります。あらゆるテキストエディタ、スプレッドシート、プログラミング言語でCSVを読み書きできます。シンプルですが、CSVパーサーは引用フィールド、エスケープされた引用符、複数行の値など、いくつかの厄介なケースを処理する必要があります。
CSVとJSONの使い分け:CSVはスプレッドシートのエクスポートやデータベースダンプなどのフラットな表形式データに適しています。JSONは階層的なデータ構造、APIレスポンス、設定ファイルに適しています。
CSV vs JSON:詳細比較
CSVとJSONの違いを理解することは、フォーマット選択と変換プロセスの理解に役立ちます:
| 特徴 | CSV | JSON |
|---|---|---|
| 構造 | フラット、表形式 | 階層的(ネストされたオブジェクト) |
| 可読性 | シンプルなデータでは簡単 | フォーマットすると読みやすい |
| ネスト | ネイティブ非対応 | 完全対応 |
| データ型 | すべて文字列 | 文字列、数値、ブール、null、配列、オブジェクト |
| ファイルサイズ | 一般的に小さい | 大きい(キーの繰り返し) |
| 用途 | スプレッドシート、DBエクスポート | API、設定、NoSQL、Webアプリ |
CSVからJSON変換の仕組み
CSV to JSONコンバーターのプロセスには以下のステップがあります:
- ヘッダー行を読む:列名を抽出し、JSONキーにする。
- 各データ行を解析:区切り文字で分割し、値をヘッダーに対応付ける。
- 引用フィールドを処理:二重引用符で囲まれた値はカンマや改行を含んでも1つのフィールド。
- データ型を検出:数値、ブール値、null値を自動変換。
- JSON配列を構築:各行がオブジェクトになり、すべて配列に集められる。
例:CSV name,age,active\nAlice,30,true は [{"name":"Alice","age":30,"active":true}] になります。
CSV to JSONコード例
JavaScript:CSV to JSON変換
CSV to JSON JavaScript変換の複数のアプローチ:ネイティブ、Papa Parse、Node.jsのcsv-parser:
// ===== Native JavaScript: CSV to JSON =====
function csvToJson(csv) {
const lines = csv.trim().split('\n');
const headers = lines[0].split(',').map(h => h.trim());
const result = [];
for (let i = 1; i < lines.length; i++) {
const values = lines[i].split(',');
const obj = {};
headers.forEach((header, index) => {
let val = values[index]?.trim() || '';
// Auto-detect types
if (val === 'true') val = true;
else if (val === 'false') val = false;
else if (val === 'null' || val === '') val = null;
else if (!isNaN(val) && val !== '') val = Number(val);
obj[header] = val;
});
result.push(obj);
}
return result;
}
const csv = `name,age,city,active
Alice,30,New York,true
Bob,25,London,false
Charlie,35,Tokyo,true`;
console.log(JSON.stringify(csvToJson(csv), null, 2));
// [
// { "name": "Alice", "age": 30, "city": "New York", "active": true },
// { "name": "Bob", "age": 25, "city": "London", "active": false },
// { "name": "Charlie", "age": 35, "city": "Tokyo", "active": true }
// ]
// ===== Papa Parse (Browser & Node.js) =====
// npm install papaparse
import Papa from 'papaparse';
// Parse CSV string
const result = Papa.parse(csvString, {
header: true, // Use first row as keys
dynamicTyping: true, // Auto-detect numbers and booleans
skipEmptyLines: true, // Ignore blank lines
});
console.log(result.data); // Array of JSON objects
console.log(result.errors); // Any parsing errors
console.log(result.meta); // Metadata (delimiter, fields, etc.)
// Parse CSV file (browser)
const fileInput = document.querySelector('input[type="file"]');
fileInput.addEventListener('change', (e) => {
Papa.parse(e.target.files[0], {
header: true,
dynamicTyping: true,
complete: (results) => {
console.log(results.data); // JSON array
},
});
});
// ===== Node.js: csv-parser (streaming) =====
// npm install csv-parser
const csvParser = require('csv-parser');
const fs = require('fs');
const results = [];
fs.createReadStream('data.csv')
.pipe(csvParser())
.on('data', (row) => results.push(row))
.on('end', () => {
console.log(JSON.stringify(results, null, 2));
});Python:CSV to JSON変換
CSV to JSON Python変換をcsvモジュール、pandas、json.dumpsで:
# ===== Python csv module =====
import csv
import json
# CSV string to JSON
csv_string = """name,age,city,active
Alice,30,New York,true
Bob,25,London,false"""
reader = csv.DictReader(csv_string.strip().splitlines())
data = list(reader)
json_output = json.dumps(data, indent=2)
print(json_output)
# CSV file to JSON file
with open('input.csv', 'r', encoding='utf-8') as csv_file:
reader = csv.DictReader(csv_file)
data = list(reader)
with open('output.json', 'w', encoding='utf-8') as json_file:
json.dump(data, json_file, indent=2, ensure_ascii=False)
# ===== pandas (recommended for large datasets) =====
import pandas as pd
# CSV to JSON with pandas
df = pd.read_csv('data.csv')
# Different JSON orientations
print(df.to_json(orient='records', indent=2)) # Array of objects
print(df.to_json(orient='columns', indent=2)) # Object of arrays
print(df.to_json(orient='index', indent=2)) # Object keyed by index
# With type conversion
df['age'] = pd.to_numeric(df['age'], errors='coerce')
df['active'] = df['active'].map({'true': True, 'false': False})
# Save to file
df.to_json('output.json', orient='records', indent=2, force_ascii=False)
# ===== Streaming large CSV files =====
import csv
import json
def csv_to_json_stream(csv_path, json_path, chunk_size=1000):
"""Convert large CSV to JSON using streaming."""
with open(json_path, 'w') as out:
out.write('[\n')
with open(csv_path, 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
first = True
for row in reader:
if not first:
out.write(',\n')
json.dump(row, out, ensure_ascii=False)
first = False
out.write('\n]')
csv_to_json_stream('large_file.csv', 'output.json')Bash / コマンドライン:CSV to JSON
コマンドラインでの変換:csvkit、miller、jq、awk:
# ===== csvkit: csvjson command =====
# pip install csvkit
# Basic CSV to JSON conversion
csvjson data.csv > output.json
# Indent output for readability
csvjson --indent 2 data.csv > output.json
# Specify a key column (creates object instead of array)
csvjson --key id data.csv > output.json
# ===== miller (mlr): powerful data processing =====
# brew install miller (macOS) or apt install miller (Linux)
# CSV to JSON
mlr --icsv --ojson cat data.csv > output.json
# CSV to JSON with filtering
mlr --icsv --ojson filter '$age > 25' data.csv
# CSV to JSON with field selection
mlr --icsv --ojson cut -f name,city data.csv
# ===== jq + awk: lightweight approach =====
# Convert simple CSV to JSON with awk
awk -F',' 'NR==1{split($0,h);next}
{printf "{";for(i=1;i<=NF;i++)
printf "%s\"%s\":\"%s\"",
(i>1?",":""),h[i],$i;print "}"}' data.csv | jq -s '.'
# ===== Using sed + jq for quick conversion =====
# Convert CSV to JSON (simple, no quoted fields)
head -1 data.csv | tr ',' '\n' > /tmp/headers.txt
tail -n +2 data.csv | while IFS=',' read -r col1 col2 col3; do
jq -n --arg a "$col1" --arg b "$col2" --arg c "$col3" \
'{name:$a, age:($b|tonumber), city:$c}'
done | jq -s '.'専用CLIツール:csvjsonとmiller
csvjson(csvkit)とmiller(mlr)はデータ形式変換専用のコマンドラインツールです:
# ===== csvkit: full suite of CSV tools =====
# pip install csvkit
# View CSV statistics
csvstat data.csv
# Convert CSV to JSON
csvjson data.csv
# Convert Excel to CSV first, then to JSON
in2csv data.xlsx | csvjson > output.json
# Query CSV with SQL syntax, output as JSON
csvsql --query "SELECT name, age FROM data WHERE age > 25" data.csv | csvjson
# ===== miller (mlr): Swiss Army knife for data =====
# CSV to JSON (pretty-printed)
mlr --icsv --ojson --jflatsep '.' cat data.csv
# CSV to JSON with data transformation
mlr --icsv --ojson put '$full_name = $first . " " . $last' data.csv
# CSV to NDJSON (newline-delimited JSON, one object per line)
mlr --icsv --ojsonl cat data.csv
# Convert between any formats
mlr --icsv --ojson cat data.csv # CSV -> JSON
mlr --ijson --ocsv cat data.json # JSON -> CSV
mlr --icsv --otsv cat data.csv # CSV -> TSV
mlr --itsv --ojson cat data.tsv # TSV -> JSONJSON to CSV変換(逆プロセス)
逆プロセスのJSON to CSVは、階層的なJSONデータをフラットな表形式に変換します。
ネストされたオブジェクトのフラット化:ドット記法やアンダースコアで展開:user.name、user.address.city。
JavaScriptとPythonでのJSON to CSV変換例:
// ===== JavaScript: JSON to CSV =====
function jsonToCsv(jsonArray) {
if (!jsonArray.length) return '';
// Flatten nested objects
function flatten(obj, prefix = '') {
return Object.keys(obj).reduce((acc, key) => {
const fullKey = prefix ? prefix + '.' + key : key;
if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key])) {
Object.assign(acc, flatten(obj[key], fullKey));
} else if (Array.isArray(obj[key])) {
acc[fullKey] = obj[key].join('|'); // Join arrays with pipe
} else {
acc[fullKey] = obj[key];
}
return acc;
}, {});
}
const flatData = jsonArray.map(item => flatten(item));
const headers = [...new Set(flatData.flatMap(Object.keys))];
const csvRows = [headers.join(',')];
for (const row of flatData) {
const values = headers.map(h => {
const val = row[h] ?? '';
// Quote values containing commas, quotes, or newlines
const str = String(val);
return str.includes(',') || str.includes('"') || str.includes('\n')
? '"' + str.replace(/"/g, '""') + '"'
: str;
});
csvRows.push(values.join(','));
}
return csvRows.join('\n');
}
// Example with nested JSON
const data = [
{ name: "Alice", address: { city: "NYC", zip: "10001" }, tags: ["dev", "admin"] },
{ name: "Bob", address: { city: "London", zip: "EC1A" }, tags: ["user"] },
];
console.log(jsonToCsv(data));
// name,address.city,address.zip,tags
// Alice,NYC,10001,dev|admin
// Bob,London,EC1A,user# ===== Python: JSON to CSV =====
import json
import csv
import pandas as pd
# Method 1: pandas (easiest)
with open('data.json') as f:
data = json.load(f)
df = pd.json_normalize(data, sep='.') # Flatten nested objects
df.to_csv('output.csv', index=False)
# Method 2: csv module (manual control)
def json_to_csv(json_data, csv_path):
"""Convert JSON array to CSV, handling nested objects."""
flat_data = [flatten_dict(item) for item in json_data]
fieldnames = list(dict.fromkeys(
key for item in flat_data for key in item.keys()
))
with open(csv_path, 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(flat_data)
def flatten_dict(d, parent_key='', sep='.'):
items = []
for k, v in d.items():
new_key = f"{parent_key}{sep}{k}" if parent_key else k
if isinstance(v, dict):
items.extend(flatten_dict(v, new_key, sep).items())
elif isinstance(v, list):
items.append((new_key, '|'.join(str(i) for i in v)))
else:
items.append((new_key, v))
return dict(items)CSV解析のエッジケース処理
堅牢なCSVパーサーは多数のエッジケースを処理する必要があります:
UTF-8 BOM:一部のアプリケーションがファイル先頭に不可視のBOMを付加します。パーサーはこれを除去すべきです。
区切り文字のバリエーション:ヨーロッパではセミコロン、TSVではタブ。良いパーサーは自動検出します。
欠損値と空フィールド:末尾のカンマや中間の空フィールド。空文字列またはnullとして保持すべきです。
複数行フィールド:RFC 4180は二重引用符内の複数行値を許可しています。
特殊文字とエスケープ:引用フィールド内の二重引用符は二重化でエスケープします。
不整合な行の長さ:堅牢なパーサーは短い行を空値で埋めるか、長い行を切り詰めるべきです。
// Robust CSV parser handling all edge cases
function parseCSV(text, delimiter = ',') {
// Strip UTF-8 BOM if present
if (text.charCodeAt(0) === 0xFEFF) {
text = text.slice(1);
}
const rows = [];
let row = [];
let field = '';
let inQuotes = false;
for (let i = 0; i < text.length; i++) {
const char = text[i];
const next = text[i + 1];
if (inQuotes) {
if (char === '"' && next === '"') {
field += '"'; // Escaped quote
i++; // Skip next quote
} else if (char === '"') {
inQuotes = false; // End of quoted field
} else {
field += char; // Regular char inside quotes
}
} else {
if (char === '"') {
inQuotes = true; // Start quoted field
} else if (char === delimiter) {
row.push(field);
field = '';
} else if (char === '\n' || (char === '\r' && next === '\n')) {
row.push(field);
rows.push(row);
row = [];
field = '';
if (char === '\r') i++; // Skip \n in \r\n
} else {
field += char;
}
}
}
// Push last field and row
if (field || row.length) {
row.push(field);
rows.push(row);
}
return rows;
}CSVベストプラクティス
最大の互換性とデータ整合性のためにこれらのベストプラクティスに従ってください:
常にUTF-8エンコーディングを使用:テキストエンコーディングのユニバーサル標準。
フィールドを一貫して引用:最も安全なのは全フィールドを引用すること。
ヘッダー行を含める:記述的な名前と一貫した命名規則で。
一貫した区切り文字を使用:ファイル全体で1つの区切り文字。
大きなファイルはストリーム処理:メモリを超えるファイルにはストリーミングパーサーを使用。
変換後にデータを検証:レコード数、データ型、整合性を確認。
よくある質問
CSVをJSONに変換するには?
ヘッダー行を解析して列名を取得し、各行を対応するキーにマッピングします。Papa Parse(JavaScript)やpandas(Python)などのライブラリ、または無料オンラインツールを使用できます。
CSVとJSONの違いは?
CSVはフラットな表形式で全値が文字列。JSONは階層的でネストオブジェクト、配列、複数のデータ型をサポート。CSVはよりコンパクト、JSONはより表現力豊か。
CSVはネストされたデータを扱えますか?
いいえ、CSVはネイティブではネスト構造をサポートしません。ドット記法、CSV内のJSON文字列エンコード、別々のCSVファイルなどでデータをフラット化する必要があります。
CSV to JSON変換は開発者とデータアナリストの基本的なスキルです。無料ツールで即座に変換できます。