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"
set colsep '",="'
みたいな感じで。