SemiMerge(2つのcsvないしExcelシートの相違を項目単位でチェック)

 最近はそうでもないが、以前は二つの表を比べて違いはないか?というチェックをよくやっていた。
 増えたレコード、無くなったレコードはないか。項目内容が変わったところはないか?  以前二つのMS-Excel表を比較して内容の異なるセルを赤で塗るというJetCompareは作ったのだが、実はあまり出番がない。行の追加or削除があると次の行から全部不一致になるので、適用できる場所がそれほど多くないのだ。(私が作ったのちに、Inquireという純正のアドインが提供されるようになったそうだが同じ制約がある。)
 そこで比較する二つの表を並べて目でチェック。あるいはif文で合ってるかどうかをみて、違っていればずらせて・・・ということをやっていたが、ついに「間に合わない」事象が発生した。「報告に先立って、明日の朝いちばんで最新データと照合して差異を確認すること!」
 違いがなければいいがあったら数千行を目でチェックしていては間に合わない。  なので明日必要な時間を今日の時間から捻出することにした。チェックツールを今のうちに作ってしまうのである。

 明日の朝、ただ一度走ればよいのだから、さらに比較するファイルは決まっているのだから、そんなに難しくはない。2つのファイルを連続で読み込んで、キーを決めてソートして、そこそこ時間はかかったが書きあがった。分かりやすいように違っている箇所に色を塗ったりしたが、レコードが挿入された次に項目だけが違うレコードが来ると、比較する一方の行だけ、色が変わっていたり、まあバグと言えばバグだ。でも差を見失うことはない。
 かくして翌日の朝、始業と同時に確認は終わった。差は4つ。でも前日にチェックしたのと同じ箇所(ようするにツールのテストで発見した分)。対処は終わっているので問題なし!

 なんだ。便利じゃないか。ならば「このツール、もうすこしきれいにしてみましょ」。同じようなことはよくやることだからね。テストチェックツールとしても有効かもしれない。それこそファイルを出力するプログラム修正したときのことを考えてみてよ。テストとして「修正前後の出力ファイルの差は、意図した項目、レコードに限られること」のチェックをやらないことはないでしょ。使い潰しの予定だったが、汎用的にするのも悪くないと思ったわけよ。

 細かい苦労は言いません。でも珍しくラフながら設計を書いて、サブルーチンも作ってみた。構造がすっきり見えているので欲が出てくる。MS-Excelシートだけでなく、csvファイルも対象ファイルとして扱えるようにしよう。(二か所書き換えるとタブ区切りファイルも扱える。)もちろん読み込むMS-Excel「ブック」に「シート」が複数あった場合はちゃんと、どれを選択するか尋ねてくるよ。最初は両方のファイルを1シートに読み込んでキーでソートして、隣り合うレコードを比較して色を塗る(削除or追加レコードはキー項目が赤く塗られ、キー以外が変更になったものは変更項目が黄色に、キーがオレンジになる)、という形でマージしたシート上でのみ分かるようにしていたが、違ったレコードは読み込んだ元のシートでも分かる方がいいかな、と色つきのまま書き戻す機能も付けた。ただしシートの切り替えが発生するのでこれをいかに高速で行うか、にはそこそこ気を遣ったよ。書き戻さなくていいから速くやってくれ、という気分になると、使う人が「書き戻しオプションを実行するかどうか選択する」というインターフェースを要求してきそうだからね。(改めておどろく私の設計意識。)言うまでもないが複数項目でユニークになる、というキー形成にも対応した。

 これで当社のテスト工数はぐっと減るはず、ダンプリストを前にして物差しとラインマーカーをもってうなる、なんて必要は激減するわけだ。効率もあがるが、心理的苦痛が大幅に軽減されることになるのは大きい・・・と言いたいが。
 私の知ったことは「合理化とは、一生懸命努力しているから、という言い訳を奪うことである。」ああ、テストの後のチェックが忙しいんだな、と他者が「この人何やっているかわかる」という風景が減ることは誰も望んでないのだろう。
 MS-Excel同士の比較だけでなく、csv形式のテキスト読み込みにも対応しているのだよ。テストで困っている人がそれに気が付けば頼んでくると思ったんだけどな。「固定長ファイル同士の比較に使えるようになりませんか?」

フリーソフト開発秘話、目次
ホーム