CSVの差分比較で「全部変わった」と出たら:行順・比較キー・重複を確認する

更新前と更新後のCSVを比較すると、ほとんどの行に差分が出ることがあります。最初に確かめたいのは、比較結果が何を基準に行を対応付けたかです。同じ行番号同士を比較していると、並べ替えだけでも大量の違いが現れます。

この記事では、架空の商品在庫CSVを使い、並び順の違いと値の変更を分けて確認します。実際の顧客情報や取引データは使っていません。

4行すべてが違って見える例

次のCSVは、1行目が列名で、その下に4件のデータがあります。商品コードは先頭ゼロを含む文字列として扱います。

変更前:

商品コード,商品名,数量
00101,方眼ノート,12
00102,角形封筒,4
00103,紙クリップ,7
00104,無地カード,2

変更後:

商品コード,商品名,数量
00104,無地カード,2
00102,角形封筒,6
00101,方眼ノート,12
00105,仕切り紙,3

同じ位置のデータ行同士を比べると、4行とも内容が違います。しかし、商品コードを目印に同じ商品同士を対応付けると、確認対象は次のように整理できます。

商品コード確認結果内容
00101値の変更なし並び位置は変わったが、商品名と数量は同じ
00102値の変更あり数量が4から6へ変わった
00103変更前だけに存在変更後のCSVには含まれていない
00104値の変更なし並び位置は変わったが、商品名と数量は同じ
00105変更後だけに存在変更前のCSVには含まれていない

この例は「追加1件・削除1件・値の変更1件・値の変更なし2件」です。追加と削除は、比較した2つのファイルに含まれるかどうかを表しています。元のシステムで新規登録や削除が行われたとまでは、このCSVだけでは判断できません。抽出条件が変わった可能性も確認します。

件数を確かめるなら、変更前は「削除1+変更1+変更なし2=4件」、変更後は「追加1+変更1+変更なし2=4件」と整理できます。前後とも4件だから更新内容が同じ、とはいえません。

比較キーを選ぶ前に確かめること

この例では商品コードを比較キーにしました。ただし、実際のCSVでも商品コード1列でよいとは限りません。同じ商品が倉庫ごとに1行ずつある表なら、商品コードだけでは行を特定できません。

最初に、前後のファイルが同じ対象・同じ抽出条件のものかを確認します。そのうえで、比較キーについて次の3点を調べます。

  • 各ファイル内で一意か: 同じ値の行が複数ないか。
  • 空欄がないか: 対応する行を識別できないデータが混じっていないか。
  • 更新の前後で変わらない識別子か: 今回変更した商品名などを目印にしていないか。

前後の両方に同じ商品コードが1回ずつ現れることは、ここでいう重複ではありません。調べるのは、変更前のファイルの中、変更後のファイルの中に、それぞれ同じキーが複数回あるかどうかです。

重複キーがあったら、上から順に結び付けない

例えば、同じ商品コードに「東倉庫」と「西倉庫」の2行があれば、倉庫まで含めて識別する必要があるかもしれません。商品コードと倉庫コードの組み合わせが各ファイルで一意で、更新前後でも同じ意味を持つなら、複数列をキーにする方法を検討できます。

組み合わせても同じキーが残る場合は、明細IDなど別の識別子や元システムの仕様を確認します。重複が消えるまで行を削ったり、都合のよい順番で1対1に結び付けたりすると、別の明細の数量を比較するおそれがあります。

キー自体を変更した場合も注意が必要です。例えばコードを00103から00105へ付け直したなら、元のコードだけを基準にすると削除と追加になります。同じ商品のコード変更かどうかは、対応表など別の根拠で確認します。

文字の違いを勝手に消さない

比較前に数値化や空白の削除をすると、元ファイルにあった違いが見えなくなることがあります。

値の例比較前に決めること
00101 と 101商品コードとして別の値か。先頭ゼロが失われていないか
4 と 4.0数量として数値を比べるのか、CSVの表記そのものを比べるのか
東倉庫 と 東倉庫 末尾の空白が入力ミスなのか、残す必要のある文字なのか

今回の架空例は、同じ列名構成のCSVを使い、商品コードと各セルを文字列の完全一致で比較しています。数値化、空白削除、表記ゆれ補正はしていません。業務上のルールで同一とみなす場合は、その処理を比較条件に記録してください。

ExcelでCSVを直接開くと、既定の設定に従って列が解釈されます。先頭ゼロを残す必要がある列は、取り込み時に文字列として扱う方法を確認してください。MicrosoftもCSVの取り込みと列の解釈について説明しています。Microsoft公式:テキスト/CSVファイルのインポートとエクスポート

列が追加・削除された場合も、値の変更と分けて確認します。共通する列だけを比較したなら、「変更なし」はその列の範囲での結果です。ファイル全体が同じという意味にはなりません。

比較結果と一緒に残すメモ

確認を引き継ぐときは、差分件数だけでなく比較条件も残します。次は今回の架空例の記録です。

比較対象:同じ範囲の商品在庫CSV(架空例)
変更前:4件/変更後:4件(列名行を除く)
比較キー:商品コード
キー確認:両ファイル内とも空欄・重複なし
比較列:商品名、数量
比較方法:文字列の完全一致。数値化・空白削除なし
並び順:今回の値の比較では判定対象外
列構成:前後で同じ
結果:追加1件、削除1件、値の変更1件、値の変更なし2件
未確認:00103がなくなった理由と00105が加わった理由

行順そのものに意味があるデータなら、並び順も別の確認項目にします。例えば表示順や処理順を表すCSVでは、セルの値が同じでも並べ替えを無視してよいとは限りません。

差分が多すぎると感じたら、元のCSVを保存したまま、少数の行で対応関係を追ってみてください。まず何と何を比較したかを明確にすると、確認すべき変更を絞り込めます。

関連記事:商品コードの先頭ゼロが消えた場所を切り分ける / CSV提出前の確認メモを残す

制作にはAIを使用しています。掲載した架空CSVの件数と比較結果は、ローカルの検証プログラムで確認しました。実データでの結果や、特定の比較ツールの動作を保証するものではありません。

コメント

このブログの人気の投稿

CSVの商品コード「00123」を守る:先頭ゼロが消えた場所を切り分ける

CSVを提出する前に残す確認メモ:件数・変更点・未確認を短く記録する