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の件数と比較結果は、ローカルの検証プログラムで確認しました。実データでの結果や、特定の比較ツールの動作を保証するものではありません。
コメント
コメントを投稿