CSVでデータが壊れる5つの原因

CSVを開いたら日本語が化けた、郵便番号の先頭の0が消えた、商品コードが日付になった。表計算ソフトで起きるこれらの事故の原因と、データを壊さずに受け渡しする方法を解説します。

CSVは「単純そうに見えて厄介」な形式

CSVはカンマで区切っただけのテキストファイルです。 仕様が単純なぶん誰でも読み書きでき、だからこそ広く使われています。

ところが実務では、開いたら文字化けした、数字が勝手に変わった、 という事故が繰り返し起きます。原因のほとんどはCSVそのものではなく、 それを開いた表計算ソフトの親切な自動変換にあります。

原因1:文字化け

日本語が「譁�蟄怜喧縺�」のような記号の羅列になるのは、 文字コードの解釈が食い違っているためです。

現在のCSVはUTF-8で保存されるのが一般的ですが、 Excelは日本語版の環境でCSVをダブルクリックで開くと、 Shift_JISとして解釈しようとします。 その結果、UTF-8のバイト列を別の文字に読み違えて化けます。

対処法

  • BOMを付ける:ファイルの先頭に「これはUTF-8です」という目印を3バイト入れます。 Excelはこれを見てUTF-8と判断します。当サイトのツールでCSVを書き出す際は、 自動でBOMを付けています
  • Excelの取り込み機能を使う:ダブルクリックせず、 「データ」→「テキストまたはCSVから」で開き、文字コードを指定します
  • 拡張子を .txt にする:Excelがウィザードを表示するので、文字コードを選べます

原因2:先頭の0が消える

郵便番号「0600001」が「600001」に、 電話番号「09012345678」が「9012345678」になる事故です。

表計算ソフトは、数字だけの値を数値と判断します。 数値の世界では 0600001 と 600001 は同じ量なので、先頭の0は意味を持たず捨てられます。

厄介なのは、この変換が開いた瞬間に起きることです。 CSVファイル自体は正しく、画面上で消えているだけ。 しかしその状態で上書き保存すると、ファイルからも0が消えます。

対処法

  • 取り込み時に、その列の書式を「文字列」に指定する
  • 当サイトのCSV⇄JSON変換ツールでJSONにするときは、 「値をすべて文字列にする」にチェックを入れると0が保たれます
  • そもそも郵便番号や電話番号は、ハイフン付きで保存しておくと数値と誤認されません

原因3:日付に化ける

最も気づきにくく、影響が大きい事故です。

入力した値表計算ソフトの解釈
1-21月2日
2/32月3日
SEPT12001年9月(環境による)
1E5100000(指数表記と解釈)

商品コードや型番がハイフンを含んでいると、日付に変換されます。 一度日付になった値は、書式を戻しても元の文字列には戻りません。 内部的にはシリアル値という数字に置き換わってしまっているためです。

生物学の分野では、遺伝子名が日付に変換される問題が深刻で、 2020年に一部の遺伝子の名称そのものが改名されたほどです。

原因4:大きな数値が丸められる

16桁を超える数字は、末尾が0に置き換わります。 クレジットカード番号や、長いIDを扱うときに起きます。

表計算ソフトが内部で使う浮動小数点数の精度が15〜16桁までしかないためで、 これは設定では回避できません。最初から文字列として扱うしかありません。

原因5:値の中の記号が壊れる

値そのものにカンマや改行が含まれる場合、書き方のルールがあります(RFC 4180)。

値に含まれるもの書き方例
カンマ全体をダブルクォートで囲む"東京都, 渋谷区"
改行全体をダブルクォートで囲む囲めば途中に改行を入れられる
ダブルクォート2つ重ね、全体を囲む "彼は""はい""と答えた"

自前で「カンマで分割する」処理を書くと、ここで必ず壊れます。 住所や備考欄のように自由入力を含むデータでは、まず間違いなく事故が起きます。 CSVの解析は、既存の実装に任せるのが安全です。

タブ区切り(TSV)という選択肢

値にカンマが含まれる可能性が高いデータでは、 区切り文字をタブにすると事故が減ります。 タブを値の中に入力することはまずないためです。 当サイトの変換ツールもタブ区切りに対応しています。

安全に受け渡すための手順

  1. UTF-8(BOM付き)で保存する。 これで文字化けの大半は防げます
  2. IDや番号は文字列として扱う。 迷ったら文字列にしておくほうが安全です
  3. 受け取ったCSVは、まず開かずに中身を確認する。 テキストエディタで開けば、自動変換なしで素の状態が見られます
  4. 表計算ソフトで開いたら、上書き保存しない。 確認だけなら閉じるときに保存しないことを徹底します
  5. 取り込みウィザードを使う。 ダブルクリックで開くのをやめるだけで、事故の多くは防げます

まとめ

  • 事故の原因はCSVではなく、表計算ソフトの自動変換
  • 文字化けはBOM付きUTF-8で保存すれば防げる
  • 先頭の0、ハイフン入りコード、16桁超の数字は文字列として扱う
  • 日付に化けた値は元に戻らない
  • ダブルクリックで開かず、取り込み機能を使う

この記事に関連するツール

ほかの読み物