システムから出した一覧を表計算ソフトで開いた。会社名の欄が記号の羅列になっている。電話番号は先頭の0が消えて9桁になり、商品コードの「1-2」はいつのまにか「1月2日」に変わっている。取引先へ送る前に気づいたのが、せめてもの救いだった。
まだ何も操作していない。ただ開いただけだ。それでも三か所が同時に壊れている。ここで慌てて手で直し始める人は多いが、その前に知っておいたほうがいいことがある。ファイルの中身は、たいていまだ無事だ。壊れたように見えているだけ、という場合がほとんどだ。
CSVはただ文字が並んだだけのファイルで、そこに「これは数字」「これは日付」という指定は入っていない。壊れて見えるのは、開いた側が中身を推測して勝手に形を決めた結果である。症状ごとに何が起きているのかと、人に渡すときの決めごとを順に見ていきます。
壊れたのはファイルではない
まず文字化けから。CSVの中では、文字は決められた規則にしたがって数字の並びに直されて保存されている。この規則が何通りかあり、書き出した側と開いた側で違うものを使うと、まったく別の文字として読まれる。これが記号の羅列の正体だ。
確かめ方は簡単で、そのファイルをテキストエディタで開いてみる。そこで日本語が読めるなら、ファイルは無事で、表計算ソフトの読み方だけがずれている。取り込みの手順から文字コードを指定し直せば元どおりに見えます。作り直してもらう必要はない。
出す側で手を打つなら、書き出すときにファイルの先頭へ目印を入れておくやり方がある。この数バイトがあるだけで、多くの表計算ソフトが文字コードを取り違えなくなる。送り先が何社もあって、一社ずつ開き方を案内していられないなら、この一手がいちばん効きます。
先頭の0が消えるのは、数として読まれたから
電話番号、郵便番号、取引先コード。先頭に0が付く値は、数として読まれた瞬間に0が落ちる。数として見れば0312345678も312345678も同じ値だからで、間違いというより、そう解釈されたということだ。
同じ理由で、桁の多い数字には別の壊れ方もある。13桁の法人番号や長い口座番号は、途中から丸められて末尾が0になったり、E+12のような表記に変わったりする。桁の多い数字は、そもそも数として扱わないと決めておくのが安全です。
防ぐには、ファイルを直接開かず、取り込みの手順を通してその列の型を「文字列」と指定する。CSVの中で値が引用符で囲まれていても、開く側がそれを無視して数と判定することがあるので、囲めば防げるとは限りません。そして一度落ちた0は、元の桁数が分からなくなるため後から足し直せない。
1-2 が 1月2日になる
日付らしく見える文字は、日付に変換される。「1-2」「3/4」は今年の1月2日、3月4日になる。年が書かれていないので、開いた年が勝手に補われる。同じファイルを来年開けば、違う日付が入るということでもある。
商品コード、サイズ、部屋番号、型番。ハイフンやスラッシュを含む短い文字は、だいたいこれに巻き込まれる。しかも一度日付になった値は、書式を文字に戻しても元へは戻らない。中身は45000番台の通し番号に置き換わっていて、元の「1-2」という文字はもう残っていないからだ。
備考欄のカンマと改行で、列がずれる
CSVはカンマで列を区切り、改行で1件を区切る。だから値の中にカンマや改行が入ると、区切りなのか中身なのか見分けがつかなくなる。入るとしたら備考欄だ。住所や社名の一部にカンマが混じることもあるし、改行しながらメモを書き足している欄も危ない。
ずれ方は三通りある。値の中のカンマが囲まれていなければ、その行だけ列がひとつずつ右へずれる。改行が囲まれていなければ、1件が2行に割れて件数が増える。囲みの引用符が閉じていなければ、そこから下がまとめて1つの値として飲み込まれる。
見つけ方は、見出しを除いた行数を数えて、想定の件数と突き合わせること。金額の欄に住所が入っているような、目で見て分かる壊れ方をしてくれるとは限らない。桁数の近い列どうしがずれた場合は、何日も気づけないことがあります。
壊れていることに気づかないまま取り込むのが、いちばん高くつく。
開いて保存し直すと、別の形になる
開くだけならファイルは変わらない。変わるのは保存した瞬間だ。ただし開けば、「保存しますか」を踏む機会がそのぶん増える。ここで押してしまうと、文字コードも、改行の形も、日付の書き方も、そのソフトの既定に置き換わる。
置き換わったファイルは、見た目には整っている。取り込む側で初めて弾かれるので、どこで形が変わったのかが分からなくなる。中身を確かめたいなら、複製を作ってそちらを開く。元のファイルはそのまま置いておきます。
渡すときの決めごと
人に渡すなら、システムから出したファイルを開かずにそのまま送るのがいちばん安全だ。確かめたいことがあれば、複製かテキストエディタで見ればいい。相手から「開けない」と言われて初めて、文字コードや区切りの相談をすれば間に合います。
出す側の決めごとも先に固めておきたい。どの列を文字として扱うか、日付は西暦4桁で書くか、備考は引用符で囲むか。そして全部の出口でそろえる。書き出す場所が何か所かあって一か所だけ作りが違うと、そこを通ったファイルだけが毎回壊れます。
そのうえで、受け取った側は件数と合計金額の二つで突き合わせる。片方だけでは通り抜ける壊れ方があるからだ。0が落ちても件数は変わらないし、行が割れても合計金額は変わらない。二つがそろって合っていれば、たいていの事故は取り込む手前で止められる。
当方は元金融系のシステムエンジニアで、Excel・紙で回している1つの作業を小さなツールにする仕事をしている。決まった形式のCSVに整えて書き出す、取り込む前に件数と合計を突き合わせる、といった1画面ぶんのものもお受けしています。毎回この手当てに時間を使っているようでしたら、ココナラのメッセージからご相談ください。