JSON ↔ CSV 相互変換と Excel の文字化け対策(BOM・ネスト平坦化)

JSON CSV Excel JavaScript Python

Web API のレスポンス(JSONデータ)を Excel や Google スプレッドシートで分析するための CSV 相互変換テクニックと、JSON↔CSV変換ツール を活用した文字化け回避方法です。


2. Excel で開いた際の文字化け原因と解決策(UTF-8 BOM)

理由

Windows版 Excel で UTF-8 の CSV ファイルを直接ダブルクリックして開くと、Excel はデフォルトで Shift_JIS として読み込もうとするため日本語が完全に文字化けします。

解決策:ファイル頭に UTF-8 BOM (\uFEFF) を挿入する

CSVファイルの先頭3バイトに Byte Order Mark (BOM) EF BB BF を付与することで、Excel が自動的に UTF-8 として認識します。

// JavaScript (Node.js / ブラウザ) での BOM 付き CSV 生成
function downloadCsvForExcel(csvString, filename = "data.csv") {
  // UTF-8 BOM (\uFEFF) を先頭に付加
  const bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
  const blob = new Blob([bom, csvString], { type: "text/csv;charset=utf-8;" });
  
  const link = document.createElement("a");
  link.href = URL.createObjectURL(blob);
  link.download = filename;
  link.click();
}

3. ネストされた(階層構造のある)JSON の平坦化 (Flatten)

ネストされたオブジェクトや配列が含まれる JSON は、そのままでは CSV の列に展開できません。

// ネストされた JSON
[
  { "id": 1, "user": { "name": "Taro", "age": 25 } }
]

ドット記法(user.name, user.age)で平坦化(Flatten)してから CSV 化します。

Python (Pandas) での爆速変換

import pandas as pd
import json

json_data = [
    {"id": 1, "user": {"name": "Taro", "age": 25}},
    {"id": 2, "user": {"name": "Hanako", "age": 30}}
]

# json_normalize でネストを列に全展開
df = pd.json_normalize(json_data)
# 画面出力: id, user.name, user.age の列ができる

# UTF-8 BOM 付きで CSV 保存
df.to_csv('output_excel.csv', index=False, encoding='utf_8_sig')