Web便利ツール集

CSVをJSONに変換する方法|文字化け・カンマ・改行の落とし穴と対処

CSVJSON文字化けデータ変換

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つあります。

  1. 受け取り側で変換するNumber()parseInt() を通す)— 最も一般的
  2. 変換後のJSONを手で修正する— 件数が少ない場合のみ
  3. スクリプトで型変換を組み込む— 定常業務なら投資に見合う

なお、安易に「数値に見えるものを全部数値にする」処理は危険です。 郵便番号 0120 や電話番号 03-1234-5678、商品コード 007 などは、数値化すると先頭のゼロが消えたり計算されたりします。IDやコードの類は文字列のまま扱うのが原則です。

Excelが勝手に変えてしまうもの

CSVをExcelで開いて保存し直すと、データが書き換わることがあります。実務上の事故として頻繁に起きるため、挙げておきます。

元のデータExcelで開いた結果
0120120(先頭のゼロが消える)
1-21月2日(日付と解釈される)
1E5100000(指数表記と解釈される)
18桁の数字末尾が 0 に丸められる

CSVの中身を確認するだけならExcelで開いても構いませんが、開いたExcelから保存し直すのは避けてください。 確認にはテキストエディタを使うのが安全です。

逆方向:JSONからCSVへ

JSONをCSVに変換する場合は、構造がフラットである必要があります。

[{ "name": "田中", "address": { "city": "東京", "zip": "150-0001" } }]

このようなネストしたJSONは、そのままでは表形式になりません。事前に平坦化するか、address.city のようなキー名に展開しておく必要があります。

また、配列の各要素でキーの構成が異なる場合も、列が揃わずに変換できません。JSONを整形して構造を確認するにはJSON整形ツールが使えます。

実務での手順

まとめると、次の順序が安全です。

  1. 元のCSVをテキストエディタで開いて文字コードと中身を確認する
  2. 必要なら UTF-8(BOMなし) で保存し直す
  3. 値にカンマが多いなら TSVに切り替える
  4. 変換ツールで変換する
  5. 結果をJSON整形ツールで検証する
  6. 型(数値・真偽値)が必要なら受け取り側で変換する

なお、変換ツールはブラウザ内で処理するため、顧客データや業務データを貼り付けてもサーバーに送信されません。 個人情報を含むCSVをオンラインの変換サービスにアップロードするのは、情報管理上の問題になり得ます。この点は業務利用では特に重要です。

まとめ

  1. split(",") で書いた自作スクリプトは、値の中のカンマで必ず壊れる
  2. 値の中に改行が入ることがある。行数=レコード数ではない
  3. 文字化けはShift_JIS、1列目だけ壊れるのはBOM
  4. カンマが多いデータはTSVに切り替えるのが確実
  5. 変換後はすべて文字列になる。IDやコードは文字列のままが正解
  6. CSVをExcelで開いて保存し直さない

CSVは仕様が単純に見えて、例外的なケースが多い形式です。事前にデータの中身を確認する一手間が、結果的に最も時間を節約します。

この記事で使うツール

関連記事