Excelでクレジットカード番号の入ったCSVファイルを正しく読む方法

たまには業務システム屋っぽいことを書いてみる。


「販売システムで障害発生!該当するクレジットデータのリストを30分以内に印刷して会議室に持って来い」
みたいなことは割りとよくあることで、でも慣れてないとハマったりする。


個人情報保護法以降、本番DBの内容は開発者の端末から直接見られなくなっていることが多い。だから上の場合も本番環境でSQLを手打ちして、該当データのみをCSV形式に落とした上でローカルに持ってきて、最終的にExcelで印刷することになる。なんだかめんどくさそうにも思えるが、これだとスピード、正確さ、チェックしやすさのバランスが良いので。


ここで困るのがクレジットカード番号。16桁目が平気な顔して化ける。

原因は消える「16桁目」の怪――カード番号を“改ざん”する仕様上の制限とはに詳しい(中村正三郎のホットコーナー経由)。ひとことで言うと数値扱いした結果の有効桁数不足。


実はこれは業務システム屋には良く知られた問題。リンク先では「セルの表示形式をあらかじめ「文字列」に変える」ことで対処可能と書いてあるが、今回あげたような既存のCSVファイルを読ませる場合この手は使えない。


じゃあどうするかというと次の2つの方法がある。

1.テキストファイルとして読み込む

CSVファイルの拡張子を.csvではなくて.txtとかにしておく。
そうするとExcelで開くときにテキストファイルウィザードが出てくるので、
該当する「列のデータ形式」を「文字列」にする。

2.CSV出力形式を工夫する

次のCSVレコードがExcelで数値扱いなのはまあしょうがない。

1234567890123456,1234567890123456,1234567890123456

じゃあ次の形式なら文字列かというと、これも数値扱い

"1234567890123456","1234567890123456","1234567890123456"

正解は以下でした。これなら文字列扱いなので16桁目は化けない。

="1234567890123456",="1234567890123456",="1234567890123456"


OracleSQL*Plusなら

set colsep '",="'

みたいな感じで。