「昨日のCSVと今日のCSVで何が変わったか」を調べるとき、行番号どうしを比較すると簡単に崩れます。

途中に1件追加されただけで、以降の行番号が全部ずれるからです。

CSVの差分は、ID、商品コード、顧客番号などのキー列で同じレコードを対応付けてから、追加・削除・変更の3種類に分けると整理しやすくなります。

行番号比較が危険な理由

旧CSV:

id,name,amount
A001,田中,1000
A002,佐藤,2000
A003,鈴木,3000

新CSV:

id,name,amount
A001,田中,1000
A004,高橋,1500
A002,佐藤,2200
A003,鈴木,3000

2行目どうしを比べると、

A002,佐藤,2000
A004,高橋,1500

で「全部変わった」ように見えます。

しかし実際には、

  • A004 が追加
  • A002 の amount が2000→2200へ変更

です。

行位置ではなく id を対応付ける必要があります。

1. まずキー列を決める

キーは、同じ対象を一意に識別できる列です。

候補は次のようなものです。

  • 顧客ID
  • 商品コード
  • 注文番号
  • 社員番号
  • システム側で付与された一意ID

名前だけをキーにすると、同姓同名や表記ゆれで誤判定しやすくなります。

キーが重複している場合は、差分比較の前にその重複を解決するか、複合キーを検討します。

2. 差分をAdded / Removed / Changedに分ける

キーを決めたら、差分は3種類に整理できます。

Added:新CSVにだけある

旧CSVに A004 がなく、新CSVにだけあるなら追加です。

Removed:旧CSVにだけある

旧CSVに存在し、新CSVから消えたキーは削除候補です。

ただし「削除された」と断定する前に、抽出条件や期間が違っていないか確認します。

Changed:両方にあるが属性が違う

A002 は両方に存在しますが、amountが違います。

旧: A002,佐藤,2000
新: A002,佐藤,2200

これが変更です。

3. ExcelならXLOOKUPで存在確認できる

2つのCSVをExcelへ取り込んだ場合、XLOOKUPを使って旧一覧から同じIDを探せます。

新一覧のA列がID、旧一覧のA列がIDなら、たとえば存在確認用の列で次のようにできます。

=XLOOKUP(A2,旧一覧!$A:$A,旧一覧!$A:$A,"未登録")

MicrosoftのXLOOKUPは、検索列から値を探し、同じ行の別列を返せる関数です。既定では最初に一致した項目を返します。

Excelのバージョン注意: XLOOKUPはMicrosoft 365や比較的新しいExcelで利用できます。Excel 2016 / 2019では利用できないため、その場合はINDEX/MATCHやPower Queryなど別手段を使います。
ただし、キーが重複していると「どの行を比較したのか」が曖昧になります。差分比較前の重複キー検査が重要です。

4. 変更は列ごとに比較する

同じキーが見つかったら、比較対象列を決めます。

たとえば、

  • name
  • amount
  • status

を比較するなら、列ごとに旧値と新値を並べます。

| id | 項目 | 旧 | 新 |
|---|---|---|---|
| A002 | amount | 2000 | 2200 |

この形にすると「行が違う」ではなく、何の値がどう変わったかを記録できます。

5. キーそのものが汚れていないか確認する

差分が大量に出たときは、本当にデータが全部変わったとは限りません。

次の違いで一致しないことがあります。

  • 00123 と 123
  • 数値123と文字列"123"
  • 前後の空白
  • 全角/半角
  • 大文字/小文字
  • 同じに見える別文字

比較前にキーの意味を確認し、必要なら「照合用キー」を別列で作ります。原本の値を上書きして正規化するのは避けます。

6. Power Queryを使う方法もある

毎月同じ比較を繰り返すなら、Power Queryで2つの一覧を取り込み、キーで結合して差分を抽出する方法もあります。

XLOOKUPは小さな比較を目で確認しやすく、Power Queryは処理手順を再実行しやすいのが利点です。

どちらを使う場合も、比較ロジックの中心は同じです。

キーで対応付ける → 片側だけを探す → 両側にある行の属性を比較する

という順です。

7. 差分結果は証跡として残す

差分を見つけたら、その場で上書きするだけでなく、結果を残しておくと後で確認できます。

最低限、

  • 比較した旧ファイル名
  • 新ファイル名
  • 比較日
  • キー列
  • Added件数
  • Removed件数
  • Changed件数

を残します。

重要なデータなら、旧CSV・新CSV自体も保持します。

まとめ

CSVの差分比較では、行番号を合わせることより同じ対象を一意に識別できるキーを決めることが重要です。

そのうえで、

  • 新しいキー=Added
  • 消えたキー=Removed
  • 同じキーで値が違う=Changed

と分ければ、差分が整理できます。

参考一次資料

おすすめの記事