SheepDev

テキスト・正規表現

2つの一覧で、追加・削除された項目を調べたい

使うツール

昨日の一覧と今日の一覧を見比べたい。作成予定のIDと、実際に作成されたIDが一致するかを知りたい。こうした問いでは、何行目に書かれているかより『どちらに含まれているか』が重要です。テキスト差分で大量の移動が表示されたら、集合として比べる方が問いに合うかもしれません。

リスト集合演算へ一行一項目で入力すると、和集合、積集合、左から右を引いた差集合、右から左を引いた差集合を確認できます。数学用語だけを覚える必要はありません。左を『予定』、右を『実績』と決め、各結果を仕事の言葉へ置き換えると読みやすくなります。

予定三件、実績三件。それでも一致しない

左:予定
alpha
beta
gamma
右:実績
gamma
beta
delta

両方とも三行ですが、中身は一致していません。共通する積集合はbetaとgamma、予定にだけある左−右はalpha、実績にだけある右−左はdeltaです。件数が同じだから漏れがない、とは判断できないことが分かります。一覧の上から同じ位置を見比べるより、所属を調べる方が不足と余分を直接説明できます。

和集合は、どちらか一方に登場する項目を一度ずつ並べたものです。この例ではalpha、beta、gamma、deltaの四種類になります。三件と三件を足して六件になるのではありません。共通する二種類を重ねて数えないことが、一覧を単純に結合する処理との違いです。

差集合には向きがある

『差分はalphaです』だけでは、足りないのか増えたのかが伝わりません。左を予定、右を実績にした場合は、左−右が未登録候補、右−左が予定外候補です。左右を逆に置けば結果の意味も逆になります。出力をコピーして渡す際には、各入力の役割と比較時点を添えてください。

あえて『候補』と呼ぶのは、一覧にないことがそのまま障害とは限らないからです。集計時刻が違う、対象期間が違う、抽出条件が違う場合にも差が出ます。ツールは入力された二つの一覧しか知りません。予定と実績を照合するなら、同じ対象範囲・同じ締切のデータかを先に確認します。

同じIDが二回あっても、集合では一種類

左へ入れる重複ありの一覧
alpha
alpha
beta
右へ入れる一覧
alpha
beta

この組合せでは左右の差集合はどちらも空になります。alphaの出現回数は二対一でも、含まれている種類は同じだからです。数量が重要な在庫、注文、発生回数の照合には、この結果だけでは不足します。『差集合が空だから件数まで一致』と結論しないようにしてください。

同じ理由で、並び順の変化も所属の差にはなりません。alpha、betaをbeta、alphaへ並べ替えても、集合としては同じです。手順の実行順、順位、優先規則を確認したいときはテキスト差分へ戻ります。二つの道具はどちらが高性能かではなく、何を同じとみなすかが違います。

空行と前後空白は、比較前に取り除かれる

このツールでは行の前後空白を除き、空の行を比較対象から外します。alphaの前後に空白があっても、alphaとして照合します。これは貼り付けた一覧を扱いやすくする一方、空白そのものを識別情報に使う入力には向きません。完全な原文の一致を調べたい場合は、空白を無視しないテキスト差分を使います。

行の途中にある空白や全角・半角、Unicodeの正規化まで一括して同じにする機能ではありません。見た目が似ている項目が差として残るなら、Unicode文字情報などで中身を確認します。原因を確かめずにすべて小文字へ変えたり記号を消したりすると、別々のIDを誤って一つへまとめる可能性があります。

大小文字を無視する前に、対象の規則を決める

左にAlpha、右にalphaを入れると、通常は左右にだけ存在する別項目になります。大小文字を無視する設定を有効にすると、共通項目として照合されます。これは一致判定の設定であり、元のシステムのID規則を調べて自動適用する機能ではありません。対象が大小文字を区別するなら、無視した結果を登録や削除の根拠にしないでください。

出力に残る綴りも、元データの唯一の正しい表記を決めるものではありません。表記を統一したい場合は、比較結果と正式なID台帳を照合します。日本語の読みや略称、同義語を推測して同じ人や商品へ結び付けることもありません。名寄せが必要なデータと、既にIDがそろった一覧の集合比較を区別しましょう。

四つの結果を、関係式で点検する

最初の例では、左だけ一件、共通二件、右だけ一件です。この三つを合わせると和集合の四種類になります。左の三種類は左だけ一件と共通二件、右の三種類は右だけ一件と共通二件に分けられます。入力行数ではなく、比較規則を適用した後の種類数で考えると、結果の読み違いを発見しやすくなります。

報告では『対象期間をそろえ、空行と前後空白を除いて比較。予定にだけalpha、実績にだけdelta』のように条件と方向を残します。差が出た項目だけを元システムで確認すれば、一覧全体を目で追うより作業を絞れます。ツールは登録・削除を行わないので、差の理由と必要な対応は、それぞれの運用手順に沿って判断してください。

同じ件数でも、同じメンバーとは限らない

処理予定がA、B、Cで、完了報告がA、C、Dなら、どちらも三件です。件数だけを見て完了とすると、Bの未処理とDの想定外処理が隠れます。予定から実績を引けばB、実績から予定を引けばDです。二つの差集合を確認するのは、足りないものと余計なものを別々に説明するためです。和集合はA、B、C、D、共通部分はA、Cとなり、全体として何が関係したかも整理できます。ただし集合の結果は、各項目が成功した理由や処理時刻を示していません。

一方、予定がA、A、Bで、実績がA、Bなら、集合としては一致します。Aを二回処理する必要があったかどうかは、この比較では判定できません。商品数、リクエスト数、支払い回数など、同じ値の出現回数そのものに意味がある場合は集合比較だけでは不十分です。一覧を作る段階で処理一回ごとのIDを使うか、別途件数を集計して照合する必要があります。『重複を消して比較できた』ことを、『必要な回数がすべて完了した』という報告へ置き換えないようにします。

一覧を渡す前には、比較した二つが同じ時点のデータかも確かめます。予定一覧を取得した後で対象が追加されたなら、実績側だけにあるIDが直ちに誤処理とは言えません。逆に実績の取得が処理途中なら、予定側だけに残るIDはまだ実行されていないだけかもしれません。集合演算は入力の時点を知らないので、結果と一緒に一覧を取った時刻や対象範囲を残します。差を見つける作業と、その差を問題と判断する作業を分けると、誤った修正へ進みにくくなります。

参考資料

使うツール

使い方・解説 →