CSVをJSONに変換する方法|文字化け・カンマ・改行の落とし穴と対処
CSVをJSONに変換する作業自体は難しくありません。つまずくのは、ほぼ例外なくデータ側の事情です。文字化け、値の中に入ったカンマ、Excelが勝手に加える変更——この記事では、変換手順と同時に、これらの回避方法をまとめます。
基本の変換
まず、素直なCSVの例です。
name,age,city
田中,30,東京
佐藤,25,大阪
これをJSONにすると、1行目をキーとしてオブジェクトの配列になります。
[
{ "name": "田中", "age": "30", "city": "東京" },
{ "name": "佐藤", "age": "25", "city": "大阪" }
]
CSV ⇔ JSON 変換ツールでは、この変換を双方向で行えます。ヘッダー行の有無と区切り文字(カンマ/タブ)を指定できます。
ここで既に1つ問題が見えています。age が "30" という文字列になっている点です。これは後述します。
落とし穴1:値の中のカンマ
CSVの最大の弱点です。
name,address,note
田中,東京都渋谷区1-2-3,備考なし
佐藤,"大阪府大阪市北区4-5-6, 7階",要確認
3行目の住所にカンマが含まれています。単純に split(",") で分割すると、1レコードが4つの値に分かれて壊れます。
正しいCSVでは、カンマを含む値をダブルクォートで囲みます。 つまり、CSVのパースは「カンマで分割する」のではなく、「クォートの内側かどうかを追跡しながら1文字ずつ読む」必要があります。
さらに、値の中にダブルクォート自体を含める場合は、ダブルクォートを2つ重ねます。
name,quote
田中,"彼は""そうだ""と言った"
これは 彼は"そうだ"と言った という1つの値になります。
split(",") で書いた自作の変換スクリプトが、本番データで壊れる原因はほぼこれです。 当ツールのパーサーはクォートの状態を追跡して処理するため、これらのケースに対応しています。
落とし穴2:値の中の改行
値の中に改行が入っているCSVも存在します。
name,memo
田中,"1行目
2行目"
これは2レコードではなく、1レコードです。 メモ欄や住所欄を含むデータをExcelから書き出すと発生します。
「行で分割してから各行をパースする」という実装は、このケースで必ず壊れます。CSVを扱うときは、行数=レコード数とは限らないと覚えておいてください。
なお、この形式のCSVは、変換先のシステムが対応していないことも多いため、そもそも値に改行を含めないルールをデータ入力側に設けるほうが根本的な解決です。
落とし穴3:文字化け(最も遭遇する)
日本語CSVで最も多いトラブルです。原因は文字コードの不一致に集約されます。
| 状況 | 文字コード | 症状 |
|---|---|---|
| Excelで「CSV」として保存 | Shift_JIS(環境依存) | UTF-8のツールで開くと文字化け |
| Excelで「CSV UTF-8」として保存 | BOM付きUTF-8 | 先頭の項目名の頭に不可視文字が付く |
| システムから出力 | UTF-8が多い | Excelで開くと文字化けすることがある |
対処のしかた
ブラウザで動くツールはUTF-8を前提としています。 Shift_JISのCSVをそのまま読み込ませると文字化けするため、変換前に UTF-8 で保存し直してください。
- Excelの場合:「名前を付けて保存」→ ファイル形式で「CSV UTF-8(コンマ区切り)」を選ぶ
- メモ帳の場合:「名前を付けて保存」→ 文字コードで「UTF-8」を選ぶ
- VS Codeの場合:右下の文字コード表示をクリック →「Save with Encoding」→「UTF-8」
BOMに注意
Excelの「CSV UTF-8」はBOM付きで保存されます。BOMはファイル先頭に付く3バイトの不可視文字で、多くのツールでは無視されますが、システムによっては1列目のヘッダー名が name のように壊れます。
JSONに変換した結果、1つ目のキーだけがおかしい場合はBOMを疑ってください。VS Codeなら「UTF-8 with BOM」から「UTF-8」に変えて保存し直せます。
落とし穴4:TSVという回避策
値にカンマが多く含まれるデータ(住所、金額、自由記述)では、そもそもカンマ区切りをやめるのが最も確実です。
TSV(タブ区切り)なら、値の中にタブが入ることは実務上ほぼないため、クォート処理の問題を回避できます。
- Excelからは「テキスト(タブ区切り)」で保存できます
- Excelのセル範囲をコピーしてテキストエディタに貼り付けると、タブ区切りで貼り付けられます
2つ目の性質は覚えておくと便利です。Excelの表をそのままコピーして、CSV ⇔ JSON 変換ツールにタブ区切りとして貼り付ければ、ファイル保存を経由せずに変換できます。
落とし穴5:型がすべて文字列になる
冒頭で触れた問題です。CSVには型の情報がないため、変換すると数値も真偽値もすべて文字列になります。
{ "age": "30", "active": "true", "price": "1000" }
これを受け取るシステムが型を厳格にチェックする場合、そのままでは通りません。
対処法は3つあります。
- 受け取り側で変換する(
Number()やparseInt()を通す)— 最も一般的 - 変換後のJSONを手で修正する— 件数が少ない場合のみ
- スクリプトで型変換を組み込む— 定常業務なら投資に見合う
なお、安易に「数値に見えるものを全部数値にする」処理は危険です。 郵便番号 0120 や電話番号 03-1234-5678、商品コード 007 などは、数値化すると先頭のゼロが消えたり計算されたりします。IDやコードの類は文字列のまま扱うのが原則です。
Excelが勝手に変えてしまうもの
CSVをExcelで開いて保存し直すと、データが書き換わることがあります。実務上の事故として頻繁に起きるため、挙げておきます。
| 元のデータ | Excelで開いた結果 |
|---|---|
0120 | 120(先頭のゼロが消える) |
1-2 | 1月2日(日付と解釈される) |
1E5 | 100000(指数表記と解釈される) |
| 18桁の数字 | 末尾が 0 に丸められる |
CSVの中身を確認するだけならExcelで開いても構いませんが、開いたExcelから保存し直すのは避けてください。 確認にはテキストエディタを使うのが安全です。
逆方向:JSONからCSVへ
JSONをCSVに変換する場合は、構造がフラットである必要があります。
[{ "name": "田中", "address": { "city": "東京", "zip": "150-0001" } }]
このようなネストしたJSONは、そのままでは表形式になりません。事前に平坦化するか、address.city のようなキー名に展開しておく必要があります。
また、配列の各要素でキーの構成が異なる場合も、列が揃わずに変換できません。JSONを整形して構造を確認するにはJSON整形ツールが使えます。
実務での手順
まとめると、次の順序が安全です。
- 元のCSVをテキストエディタで開いて文字コードと中身を確認する
- 必要なら UTF-8(BOMなし) で保存し直す
- 値にカンマが多いなら TSVに切り替える
- 変換ツールで変換する
- 結果をJSON整形ツールで検証する
- 型(数値・真偽値)が必要なら受け取り側で変換する
なお、変換ツールはブラウザ内で処理するため、顧客データや業務データを貼り付けてもサーバーに送信されません。 個人情報を含むCSVをオンラインの変換サービスにアップロードするのは、情報管理上の問題になり得ます。この点は業務利用では特に重要です。
まとめ
split(",")で書いた自作スクリプトは、値の中のカンマで必ず壊れる- 値の中に改行が入ることがある。行数=レコード数ではない
- 文字化けはShift_JIS、1列目だけ壊れるのはBOM
- カンマが多いデータはTSVに切り替えるのが確実
- 変換後はすべて文字列になる。IDやコードは文字列のままが正解
- CSVをExcelで開いて保存し直さない
CSVは仕様が単純に見えて、例外的なケースが多い形式です。事前にデータの中身を確認する一手間が、結果的に最も時間を節約します。