Excelだけではない「CSVとパーサー問題」の正体
データ連携をしていると、
001 → 1
になったり、
2025-01-01
が勝手に日付になったり、
TRUE
が真偽値扱いされたりします。
この問題、よく 「Excelが悪い」 と言われます。
ですが、実は本質はそこではありません。
根本原因は、 CSVが型情報を持たない ことにあります。そして、パーサー(読み込み側)が推測するしかないことが問題の本質です。
この記事では、
- なぜこの問題が起きるのか
- CSVの限界
- パーサーとは何か
- Excelだけの問題ではない理由
- 実務ではどう対策するのか
を初心者にも、わかりやすく解説します。
まずCSVとは?
CSVは、「Comma Separated Values」の略です。
00123,Tokyo,TRUE
のように、 カンマ区切りのテキスト です。
つまり、CSVは 「ただの文字列」 です。
ここが本当に重要です。
👉 CSVには型情報がない。
例えば:
00123
があったとしても、
CSV自体は:
- 数値なのか
- 文字列なのか
- 商品コードなのか
- 郵便番号なのか
を知りません。
つまりCSVはこう言っている。「00123って文字があります」だけです。
意味は持っていません。
では、どうやって単なる文字列に意味を持たせているのでしょうか?
そこで登場するのが「パーサー」です。
パーサーとは?
パーサーとは、「文字列を解釈する仕組み」のことを言います。
例えば:
| ソフト | パーサー |
|---|---|
| Excel | Excelの読み込み処理 |
| Python | pandas CSVリーダー |
| JavaScript | JSON/CSVパーサー |
| BIツール | インポート機能 |
など。
つまり、CSV は、文字列そのものに意味は定義されていないが、これらのパーサーが解釈することで、文字列に意味を持たせる仕組みとなっています。
パーサーは「推測」する
CSV に型情報がないので、
パーサーは:
「これは数値っぽいな」
と推測します。
例えば
CSV
00123
Excelの解釈
「数値だな」
↓
123
になります。
でも本来は?
例えば:
本当の意味
- 郵便番号
- 社員コード
- 商品コード
なら、
文字列として扱うべきかもしれません。
ここが重要です。
このような事態は、なにもExcelだけに限定した話ではなく、Pythonでも起きます。
例えば Python の pandas。
read_csv() を使うと、 自動型推測 が走ります。
例えば
00123
↓
123
になることがあります。
BIツールでも起きる
例えば:
- Power BI
- Tableau
- Looker
なども、型推測を行います。
なぜこうなる?
理由は単純です。CSVには、 型情報が存在しない からです。
NULL問題も同じ
例えば:
A001,
これも、カンマの次が
- NULL
- 空文字
- 空白
のどれなのかCSV単体では分かりません。
そこに、ゆらぎが発生します。同じ CSV を解釈しても、解釈するパーサーの解釈の違いにより、データの意味合いが変わってしまう可能性があるのです。
つまり本質は「型情報なしデータをどう解釈するか」の問題です。
残念ながら、この解釈方法に明確な規定は、存在しません。あるのは、慣習のようなものだけです。
実務でよく起きる事故
- 001問題
00123 → 123
- 日付化
1-1 → 1月1日
- 指数表記
100000000000 → 1E+11
- TRUE/FALSE問題
TRUE が真偽値化。
- NULL問題
空欄解釈がシステムごとに違う。
では、実務ではどう対策すれば良いのでしょうか?
かなり重要です。
方法① 型を決める
例えば:
| 項目 | 型 |
|---|---|
| 郵便番号 | 文字列 |
| 顧客コード | 文字列 |
| 金額 | 数値 |
を先に決めます。
方法② CSVをそのまま信用しない
これは重要です。
CSVは、「ただの文字列」と考える。
方法③ インポート時に型指定
例えば:
データ → テキスト/CSVから
で、
- 数値
- 文字列
- 日付
を明示。
ただし、パーサーが読み込む際のデータの意味付けに対応している必要があります。
方法④ 正規化する
例えば:
=A1&""
で強制的に文字列化する。
方法⑤ データ仕様書を作る
かなり実務的です。
例えば:
| 列名 | 型 | NULL許可 |
|---|---|---|
| customer_code | string | NO |
| amount | number | YES |
を決める。
これは「データ連携」の枠を超えて、「データ設計」の話になってきます。
いづれの方法も、絶対ではありませんが、データ連携を行う前に、これらの方法をとることで、連携時のデータ齟齬は減ります。
データ化けの本質
ほとんどの人は、このような問題に直面すると「Excelが変」だと思います。
でも本質は、
「データに型情報がない」
ことです。
そして、それを扱うシステムは、限られた情報の中で、推測するしかないのです。
だから:
- Excel
- Python
- BIツール
- DB
どれを CSV の処理に利用しようと、同じ問題が起きます。
大切なのは、それが起こることを当然として、その原因を理解した上で、対応することです。
対策例:
- 自動推測させずに、文字列として処理
- 不安定な(空欄)を用いず、""固定
- 半角、全角のスペースは除去
- 日付の型は固定(YYYY/MM/DD)
などのデータスクリーニングを実施する。
まとめ
「001が1になる問題」は、Excel固有の問題ではありません。
本質は:
- CSVが型情報を持たない
- パーサーが推測するしかない
ことにあります。
つまり、
「型情報なしデータをどう解釈するか」という、データ連携全体に共通する問題です。
実務では、
- 型設計
- 型指定
- 正規化
- データ仕様書
が非常に重要になります。
そしてデータクリーニングとは、「見た目の文字列」ではなく、 「そのデータをどう解釈するか」 を整理する作業でもあるのです。