2つのCSVファイルを比較して変更点を見つける方法

2つのCSVファイルを比較する最速の方法は、両方をサイドバイサイドのdiffツールに貼り付け、 列を揃えて、ハイライトされた行を読むことです。比較は簡単な部分です。 人を悩ませるのはノイズです。並び替えられたエクスポート、カンマの代わりのセミコロン、 誰かが引用符で囲んだ値によって、同じデータを持つ2つのファイルが まったく共通点がないように見えてしまいます。

このガイドでは、クリーンで信頼できるCSVのdiffを取得する方法を解説します。 同等の2つのエクスポートが紙の上で離れていく理由、知っておくべき手法、 そして実際に試せるワークド・エグザンプルを紹介します。ツールだけが必要な場合は、 CSV比較ページでブラウザ上のすべてを処理できます。

CSVファイルの比較が意外と難しい理由

CSVは単純に見えますが、唯一の厳格な標準がありません。最も近いのは RFC 4180ですが、 現実の多くのファイルはそれに従っていません。同じテーブルの2つのエクスポートは、 まったく同じデータを記述していても、区切り文字、引用符、改行コード、行順序が 異なる場合があります。プレーンテキストのdiffはそのことを知らないため、すべてをフラグとして立てます。

始める前に判断すべき重要な点があります。行順序はあなたにとって重要ですか? 名前でソートされたデータベースエクスポートと、IDでソートされた同じエクスポートは、 同一のレコードセットを保持していますが、行のdiffではほぼすべての行が赤と緑に塗られます。 行に安定したキー(ID列)がある場合、両方のファイルを最初にそのキーでソートすると、 diffが再び読みやすくなります。

変更に見えるが、たいていそうではないもの
diffで見えるもの本当の変更か?対処法
行の順序が異なるいいえ、データが同じセットなら両方のファイルをキー列でソートする
カンマ vs セミコロンの区切り文字いいえ、同じフィールド1つの区切り文字に正規化する
Ada vs "Ada"いいえ、ここでは引用符は任意引用符を正規化する
CRLF vs LFの改行コードいいえ改行コードを正規化する
末尾の空行いいえトリムする
セルの値が変わったはい調査する、これは本物

区切り文字の行は、特に地域をまたぐと多くの人を引っかけます。多くのヨーロッパのロケールでは、 カンマが小数点区切りであるため、セミコロンを使用します。同じデータ、異なる区切り文字です。 ブラウザやツールが表形式テキストをどう読むかの詳細が必要なら、MDNの ブラウザでのファイル読み取りに関するノートが 役立つ出発点です。

CSVを比較する4つの方法とその使い分け

唯一の最良の方法はありません。ファイルのサイズと、行順序が重要かどうかによって異なります。 よく使われる方法を比較します。

方法向いている場面手間CSVを理解するか?
目視確認小さなファイル、数行いいえ、あなたがパーサー
オンラインdiffツールクイックチェック、どこからでも貼り付け可能行ごとに、はい
表計算アプリ視覚的なレビュー、数式、フィルタリングはい、ただし手動
コマンドライン(sortcsvkit大きなファイル、スクリプティング、キーによる比較最初にソートすれば対応

ほとんどの人にとって、ブラウザツールは速度面で優れています。インストール不要で、 ダウンロードやデータベースクライアントから直接エクスポートを貼り付けられます。 問題は行順序と区切り文字のノイズで、次で解決します。非常に大きなファイルには、 コマンドラインのcsvkitを 学ぶ価値があります。

最速のクリーン比較、ステップバイステップ

誰かが2つのエクスポートを渡して「何が違うの?」と聞いてきたときに使うルーティンです。 1分もかかりません。

  1. 両方のファイルが同じ区切り文字を使い、同じヘッダー行を持っていることを確認する。
  2. 行順序が重要でない場合は、まず両方のファイルをキー列でソートする。
  3. CSV比較ツールを開く。
  4. 左に元のファイル、右に新しいバージョンを貼り付ける。
  5. 結果を読む。緑は追加された行、赤は削除された行、変更されたセルはそれぞれ1つずつ表示される。

行が順序付けられていない場合、ステップ2がすべての鍵です。両方のファイルが 同じ方法でソートされると、ハイライトされるのは実際に変更された行だけになります。 diffエンジンはGoogleの diff-match-patchを 基盤としており、最初に行単位で比較するため、長いファイルでも高速に動作します。

実例

ユーザーテーブルへの変更をレビューしているとします。変更前:

id,name,role,seats
7,Ada Lovelace,editor,3
8,Alan Turing,viewer,1

そして、異なる行順序でエクスポートされた変更後:

id,name,role,seats
8,Alan Turing,viewer,1
7,Ada Lovelace,admin,5

これをプレーンな行ベースdiffに入力すると、両方のデータ行が変更されたように見えます。 位置を入れ替えたためです。両方をid列でソートすると、実際の話は短くなります:

実際に変更されたもの
行(idによる)変更前変更後変更
7roleeditoradmin変更
7seats35変更
8変更なし(移動のみ)

本物の編集は1つ:Adaのロールとシート数が変わりました。Alanの行は移動しただけです。 editorからadminへのその昇格は、まさにレビューで捉えたい類のものですが、 diffが誤って変更とフラグした行に埋もれていると見逃しやすいです。

コマンドラインで行順序のノイズを除去する

ファイルがすでにディスクにあり、行に固有の順序がない場合、同じ「まずソート」のアイデアが 2つの短いコマンドで機能します。ヘッダーをそのまま残し、残りをソートします:

(head -1 old.csv; tail -n +2 old.csv | sort) > old.sorted.csv
(head -1 new.csv; tail -n +2 new.csv | sort) > new.sorted.csv
diff old.sorted.csv new.sorted.csv

これでdiffは本当に変更された行のみを報告します。両方のファイルが同じ順序だからです。 列順序も無視するキーによる比較には、csvkitのcsvsortcsvjoinが より多くの制御を与えてくれます。これはブラウザで比較する前に両側をソートする ターミナル版です。

区切り文字、引用符、そして雑然とした現実

実際のCSVファイルは常にルールを破ります。カンマを含むフィールドは引用符で囲む必要があるため、 "Lovelace, Ada"は2つではなく1つのフィールドです。引用符で囲まれたフィールド内の 引用符は二重になります:"She said ""hi"""。そして区切り文字自体も変わります。 カンマを小数点とするロケールの表計算ソフトはセミコロンでエクスポートし、 タブ区切りファイル(TSV)はデータパイプラインで一般的です。比較する前に、 両方のファイルが同じ区切り文字と同じ引用符の慣習を使っていることを確認するか、 RFC 4180に従うパーサーで正規化してください。そうしないと、diffは同じデータの2つのバージョンではなく、 2つの異なる方言を比較していることになります。

注意すべき一般的な落とし穴

落とし穴なぜ問題になるか対処法
区切り文字の不一致カンマ vs セミコロンですべてのフィールドが違って見えるまず1つの区切り文字に正規化する
先頭のBOM隠れたバイト順マークが最初のヘッダーセルを変える比較前にBOMを除去する
先頭ゼロのID表計算ソフトが0077に変えているかもしれないID列をテキストとして保持し、文字列として比較する
埋め込まれた改行引用符付きフィールドが改行を含み、それ以降のすべての行をずらす場合がある行分割ではなく、本物のCSVパーサーを使う
セル内の末尾スペース見えないスペースが変更として表示される比較前にセルの値をトリムする

表計算ソフトの方が良いツールである場合

テキストdiffは、どの行が変更されたかを見つけ、変更をデータとしてレビューするのに最適です。 しかし、数千行にわたってフィルタリング、ピボット、数式での比較が必要なら、 表計算ソフトの方が適しています。両方のファイルをインポートし、キーで揃え、 ルックアップで不一致をフラグします。2つのアプローチは互いに補完し合います。 diffは素早い視覚的な読み取りに、表計算ソフトはデータを切り分ける必要があるときに使います。 いずれの場合も、基盤となる形式のルールについては、 WikipediaのCSV概要が 確かな参考資料です。

関連ツール

CSVだけを扱うことはほとんどありません。同じデータがJSONとしても存在するなら、 JSON比較が同じアイデアを適用します。 値の列の重複排除は重複行の削除で素早く行え、 diffの前に行を予測可能な順序に並べるのは 行のソートの役割です。

よくある質問

CSVファイルをオンラインで比較するとどこかにアップロードされますか?
comparetext.orgではdiffはブラウザで実行されます。2つのCSVファイルはあなた自身のマシン上のJavaScriptによって比較されるため、明示的に保存または共有をクリックしない限り、サーバーには何も送信されません。これにより、顧客のエクスポート、財務データ、その他キーストロークのたびにアップロードするサイトに貼り付けたくないスプレッドシートにも安全です。
2つのCSVファイルがすべての行で異なると表示されるのはなぜですか?
ほぼ常に行順序か区切り文字の問題であり、本物の変更ではありません。一方のエクスポートがもう一方と異なる順序でソートされているか、一方がカンマでもう一方がセミコロンを使っているか、改行コードが異なります。両方のファイルが同じ区切り文字を使うようにし、次に両方をキー列でソートして順序が問題にならないようにします。その後、diffは通常、本当に変更された少数の行とセルに縮小されます。
行順序を無視して2つのCSVファイルを比較するにはどうすればよいですか?
比較する前に、両方のファイルを安定したキー列でソートします。行にIDがあればそれでソートし、なければ行全体をソートします。ヘッダー行をそのまま残し、データ行だけをソートします。ブラウザではソート済みバージョンを貼り付けられます。コマンドラインでは、ヘッダーの後にファイルをソートします。両方のファイルが同じ順序になると、単に移動しただけのすべての行ではなく、実際に変更された行だけがdiffに表示されます。
なぜ私のCSVはカンマではなくセミコロンを使っているのですか?
多くのヨーロッパのロケールはカンマを小数点区切りとして使うため、表計算アプリは曖昧さを避けるために代わりにセミコロン区切りでCSVをエクスポートします。データは同じで、区切り文字だけが異なります。2つのファイルを比較する前に、同じ区切り文字を使っていることを確認しないと、すべてのフィールドが変更されたとフラグされます。CSV対応のツールで両方をカンマ(または両方をセミコロン)に正規化すれば解決します。タブ区切りファイルは、異なる区切り文字で同じ問題を抱えています。
列順序が異なるCSVファイルを比較するにはどうすればよいですか?
プレーンテキストのdiffは行を左から右へ比較するため、並び替えられた列はデータが一致していても完全な変更のように見えます。これに対処するには、まず両方のファイルで列が一致するように並べ替えるか、位置ではなくヘッダー名で比較するCSV対応ツールを使います。csvkitのようなコマンドラインツールは、名前で列を選択し並べ替えられます。列が同じ順序で揃うと、通常の行ごとのdiffが再び機能します。
ページがフリーズせずに大きなCSVファイルを比較できますか?
はい、ある程度まで。行モードdiffは、各文字ではなくまず行全体を比較するため、数千行のファイルでも高速です。非常に大きなファイル(数十メガバイトや数百万行)は、データをストリームするcsvkitのようなコマンドラインツールやデータベースインポートで処理する方が適しています。ブラウザで快適にスクロールできるエクスポートなら、オンラインdiffが速い選択肢です。

試してみませんか?CSV比較ツールにファイルを貼り付けて、何が変わったか確認しましょう。