テキストの差分
目的および概要 似たような2つのテキストの違いを調べたい場面が、たまにあります。 テキストを出力するプログラムの修正で意図した結果になっているか確認する場合や、プログラムの変更箇所を調べる場合などです。 いろいろな比較ツールがあり、これを使えば、違いをわかりやすく見る事ができます。 ここでは、敢えてVBAで比較する方法を検討します。 一致する箇所を探す 目的は2つのテキストの違う箇所の探す事ですが、その為には一致する箇所を探します。元のデータから一致箇所を取り除けば、残ったデータが不一致箇所となります。 2つのファイルは殆ど一緒の前提(その為、プログラムで不一致箇所を調べたいので)です。テキストの先頭から読み込み、行単位で比較して一致する箇所を取り除きます。 不一致の場合は、次に一致する行をなるべく近い位置で探します。いろいろな方法が考えられますが、スキップする行数の合計を1から順に増やしながら探し、最初に見つかった行同士を次の一致箇所とする方法が簡単です。 見つかった一致箇所までは不一致箇所として残します。一致箇所から処理を繰り返し一致する箇所を取り除きます。 これで、不一致箇所が残ります。 行単位の比較 行単位での比較は、strcompを使うのが簡単です。 不一致箇所を見つけたときに次の一致箇所を探すのですが、このとき、同じ行を何度も読み込む事になります。もし、strcomp が遅いと思われるなら、文字数を配列に保存しておき最初に評価する事で不要なstrcompを回避できます。 また、曖昧な評価をしたい場合は、予めテキストを変換するか、strcompとは別に比較のロジックを準備します。 前者の例では、スペース文字とタブ文字を同一にする場合は、予めタブ文字をスペース文字に置換します。また、スペース文字の数を無視する場合は、複数のスペース文字を1文字のスペース文字に予め置換します。 文字単位の比較 行の中のどの文字が違うかを知りたい場合は、行単位ではなく、文字単位で処理します。 文字単位の場合でも、基本的な考え方は一緒で、一致箇所を取り除いた残りを不一致とします。但し、行という纏った単位がないため、一致箇所を探す場合はデータの近さより、一致箇所の長さに注目した方が良い結果となると思います。 具体的には、まず、データ全体を、不明箇所として考えます。 不明箇...