戻る

CSV キー比較

データ変換

読み込み中

ツールを読み込んでいます

ツールのコードは開いたときにのみ読み込まれます。

このツールの処理はすべてブラウザー内で行われ、入力内容はサーバーへ送信されません。

このツールについて

行番号ではなく、レコードを識別する列で2つの CSV スナップショットを比較します。テキストを貼り付けるかローカルファイルを選び、共通の主キー列、または複数列からなる複合キーを指定してください。追加・削除・変更・変更なしの行を集計し、列の追加と削除、セルごとの変更前後の値を確認できます。注文履歴や倉庫在庫では、並べ替えただけのデータを大量の変更として扱わずに済みます。解析と比較は終了可能なブラウザーワーカー内で実行され、入力のアップロードや永続保存は行いません。

主な用途

  • 注文の旧エクスポートと新エクスポートを order_id で照合し、追加注文、削除レコード、状態や金額の文字列の変更を確認する。
  • warehouse と sku の複合キーで在庫を比較し、同じ商品でも倉庫ごとに別レコードとして扱う。
  • CSV の列構造と行内容の変更を区別し、元の文字列を保持する JSON レポートや縦持ち形式の差分 CSV を残す。

使い方

  1. 1.変更前・変更後の CSV を貼り付けるか、それぞれローカルファイルを選びます。カンマ、セミコロン、タブ、縦棒から区切り文字を個別に選び、先頭行がヘッダーかを確認します。必要に応じて文字コードを選択してください。UTF-8、UTF-16LE、UTF-16BE に対応します。 列の検査を実行してから、両側に同じ名前で存在するキー列を1つ以上選びます。ヘッダーなしでは column1、column2 などの自動生成名を使います。複合キーは選択値の組み合わせで照合するため、各組み合わせがそれぞれの側で最大1行に対応する必要があります。
  2. 2.必要がなければ文字列の完全一致を使います。前後の空白除去や大文字小文字の無視は、キーとセル値の比較の両方に適用され、ヘッダー名には適用されません。キーの一部が空の場合は既定で拒否します。空の値に意味があり、一意性を保てる場合だけ明示的に許可してください。 比較を実行し、行数、追加・削除列、セルの差分を確認します。重複キーや解析エラーは修正してから再実行してください。曖昧な入力から部分的な照合結果は作りません。必要ならキャンセルできます。入力や比較設定を変更すると以前の結果は無効になります。
  3. 3.元のセル文字列を保持するには JSON レポートを保存します。差分 CSV は kind,key,column,before,after,before_present,after_present の列を持ち、key は JSON 配列です。表計算ソフト用には数式対策を有効にしたままにし、元の文字列での出力は警告と利用先の動作を確認してから選びます。 画面の絞り込みや省略表示によって出力データが減ることはありません。

再現できるキー比較の例

行順を変えた注文データの比較

{
  "before": "order_id,status,total\n001,pending,12.50\n002,paid,0\n003,paid,7",
  "after": "order_id,status,total\n003,paid,7\n001,paid,12.50\n004,pending,5",
  "beforeOptions": {
    "delimiter": ",",
    "header": true
  },
  "afterOptions": {
    "delimiter": ",",
    "header": true
  },
  "compareOptions": {
    "keys": [
      "order_id"
    ],
    "trim": false,
    "ignoreCase": false,
    "emptyKeys": "reject"
  }
}
{
  "summary": {
    "added": 1,
    "removed": 1,
    "changed": 1,
    "unchanged": 1,
    "cellsChanged": 1
  },
  "columnsAdded": [],
  "columnsRemoved": []
}

order_id をキーにします。注文 004 は追加、002 は削除、001 は状態変更、003 は変更なしです。行の並べ替え自体では差分は増えません。出力例は集計の抜粋です。

倉庫と SKU を使う在庫の複合キー

{
  "before": "warehouse,sku,qty,note\nNorth,A,10,\"ready, packed\"\nSouth,A,5,\"line 1\nline 2\"\nNorth,B,8,hold",
  "after": "sku,warehouse,note,qty\nA,South,\"line 1\nline 2\",6\nA,North,\"ready, packed\",10\nC,North,new,4",
  "beforeOptions": {
    "delimiter": ",",
    "header": true
  },
  "afterOptions": {
    "delimiter": ",",
    "header": true
  },
  "compareOptions": {
    "keys": [
      "warehouse",
      "sku"
    ],
    "trim": false,
    "ignoreCase": false,
    "emptyKeys": "reject"
  }
}
{
  "summary": {
    "added": 1,
    "removed": 1,
    "changed": 1,
    "unchanged": 1,
    "cellsChanged": 1
  },
  "columnsAdded": [],
  "columnsRemoved": []
}

warehouse と sku を両方選びます。South/A の数量が 5 から 6 に変わり、North/B は削除、North/C は追加、North/A は変更なしです。列順が変わっても照合でき、引用符内のカンマと複数行のメモはセル内容として扱われます。

列の位置ではなく正確なヘッダー名で照合

{
  "before": "id,name\n1,Alice",
  "after": "name,id\nAlice,1",
  "beforeOptions": {
    "delimiter": ",",
    "header": true
  },
  "afterOptions": {
    "delimiter": ",",
    "header": true
  },
  "compareOptions": {
    "keys": [
      "id"
    ],
    "trim": false,
    "ignoreCase": false,
    "emptyKeys": "reject"
  }
}
{
  "summary": {
    "added": 0,
    "removed": 0,
    "changed": 0,
    "unchanged": 1,
    "cellsChanged": 0
  },
  "columnsAdded": [],
  "columnsRemoved": []
}

name と id の位置だけが入れ替わっています。ヘッダーありの場合、名前も値も同じなので変更なしの1行となります。

先頭のゼロと小数表記を保持

{
  "before": "id,code,total\n001,007,1.0",
  "after": "id,code,total\n001,7,1",
  "beforeOptions": {
    "delimiter": ",",
    "header": true
  },
  "afterOptions": {
    "delimiter": ",",
    "header": true
  },
  "compareOptions": {
    "keys": [
      "id"
    ],
    "trim": false,
    "ignoreCase": false,
    "emptyKeys": "reject"
  }
}
{
  "summary": {
    "added": 0,
    "removed": 0,
    "changed": 1,
    "unchanged": 0,
    "cellsChanged": 2
  },
  "columnsAdded": [],
  "columnsRemoved": []
}

すべての値を文字列として扱います。キー 001 の code は 007 から 7、total は 1.0 から 1 に変わるため、変更ありです。数値への自動変換や金額の計算は行いません。

空のセルでも列構造の変更を検出

{
  "before": "id,old\n1,",
  "after": "id,new\n1,",
  "beforeOptions": {
    "delimiter": ",",
    "header": true
  },
  "afterOptions": {
    "delimiter": ",",
    "header": true
  },
  "compareOptions": {
    "keys": [
      "id"
    ],
    "trim": false,
    "ignoreCase": false,
    "emptyKeys": "reject"
  }
}
{
  "summary": {
    "added": 0,
    "removed": 0,
    "changed": 1,
    "unchanged": 0,
    "cellsChanged": 2
  },
  "columnsAdded": [
    "new"
  ],
  "columnsRemoved": [
    "old"
  ]
}

old 列が削除され、new 列が追加されます。存在しない列と空文字列を持つ列は異なるため、対応する行も変更ありです。列名変更とは推測しません。

前後の空白除去と大文字小文字の無視を有効化

{
  "before": "id,status\n A , Paid ",
  "after": "id,status\na,paid",
  "beforeOptions": {
    "delimiter": ",",
    "header": true
  },
  "afterOptions": {
    "delimiter": ",",
    "header": true
  },
  "compareOptions": {
    "keys": [
      "id"
    ],
    "trim": true,
    "ignoreCase": true,
    "emptyKeys": "reject"
  }
}
{
  "summary": {
    "added": 0,
    "removed": 0,
    "changed": 0,
    "unchanged": 1,
    "cellsChanged": 0
  },
  "columnsAdded": [],
  "columnsRemoved": []
}

両方を有効にすると、キーと status は同じと判定されます。JSON レポートには元の大文字小文字や前後の空白が残ります。この設定はヘッダー名の照合には適用されません。

一意に対応づけられない重複キーを拒否

{
  "before": "id,name\n1,Alice\n1,Bob",
  "after": "id,name\n1,Alice",
  "beforeOptions": {
    "delimiter": ",",
    "header": true
  },
  "afterOptions": {
    "delimiter": ",",
    "header": true
  },
  "compareOptions": {
    "keys": [
      "id"
    ],
    "trim": false,
    "ignoreCase": false,
    "emptyKeys": "reject"
  }
}
{
  "error": "duplicateKey",
  "side": "before"
}

変更前の2行はどちらもキーが 1 です。重複キーの診断を表示して比較を停止し、Alice、Bob、先頭行、末尾行などを勝手に選びません。

区切り文字が異なるヘッダーなしのデータ

{
  "before": "001;alpha\n002;beta",
  "after": "001|alpha\n003|gamma",
  "beforeOptions": {
    "delimiter": ";",
    "header": false
  },
  "afterOptions": {
    "delimiter": "|",
    "header": false
  },
  "compareOptions": {
    "keys": [
      "column1"
    ],
    "trim": false,
    "ignoreCase": false,
    "emptyKeys": "reject"
  }
}
{
  "summary": {
    "added": 1,
    "removed": 1,
    "changed": 0,
    "unchanged": 1,
    "cellsChanged": 0
  },
  "columnsAdded": [],
  "columnsRemoved": []
}

変更前はセミコロン、変更後は縦棒を選び、両方ともヘッダーなしにします。自動生成された column1 をキーにすると、002 は削除、003 は追加、001 は変更なしです。

CSV 比較でよくある誤り

  • 同じ商品が複数倉庫にあるのに、sku だけをキーとして選ぶ。
  • 区切り文字やヘッダー設定を間違えたまま、誤って解析された列からキーを選ぶ。
  • 文字列の比較なのに 001 と 1、1.0 と 1 を同じと考える。
  • 空白や大文字小文字の無視を有効にした後、別々だったキーの衝突を確認しない。
  • 識別子の変更を同じ行の編集と解釈したり、列名変更の自動検出を期待したりする。
  • 信頼できない元の文字列の差分 CSV を表計算ソフトで開く、または非公開情報を確認せず出力を共有する。

制限と注意事項

  • 片側につきファイルのバイト数とデコード後の UTF-8 バイト数がそれぞれ 2 MiB、データ 10,000 行、128 列、200,000 セルまで、出力は 12 MiB までです。終了可能なワーカーに制限時間を設け、キャンセルや上限超過で処理を停止します。大きなファイルは両方を同じキー範囲で分割するか、ローカルのデータベースやデータ処理ツールを使ってください。制限時間は厳密なメモリー隔離を保証しません。 UTF-8、UTF-16LE、UTF-16BE として厳密にデコードできるファイルに対応します。BOM は選択した文字コードと一致する必要があり、解析前に取り除きます。BOM の処理は GBK や Shift_JIS などへの対応を意味しません。対応する文字コードで再出力してください。区切り文字は明示指定し、不正な引用符や列数の不一致は自動修復せず拒否します。 画面は1ページ25行、1行につき最大12セルと6つのキー要素を表示し、長い値は省略します。全体は出力したレポートで確認してください。
  • ヘッダーは列順によらず名前の完全一致で照合し、空白のみのヘッダーや重複ヘッダーを拒否します。空白や大文字小文字の設定でヘッダーを正規化・改名することはありません。ヘッダーなしの column1、column2 などは位置を表すため、列を並べ替えると意味が変わります。 列の追加・削除は構造上の差分です。対象セルが空でも、対応する行を変更ありと判定する場合があります。列名変更は推測せず、キーの変更は行の削除と追加として表します。行の並び順自体は比較しません。
  • 片側でも同じ複合キーが重複すると比較を停止します。空白除去や大文字小文字の無視で生じた衝突も対象です。先頭行、末尾行、多対多の照合規則は推測しません。キーのどれかが空なら既定で拒否し、空を明示的に許可しても重複検査は続けます。 すべてのセルは文字列です。001 と 1、1.0 と 1 は異なります。空白除去は前後だけに適用します。大文字小文字の無視は、曖昧検索、Unicode 正規化、ロケール別照合や数値許容差を提供しません。日付、数値、数式の評価は行いません。
  • JSON は比較オプションを有効にしても解析後の元の文字列を保持しますが、入力ファイルのバイト単位の複製ではありません。差分 CSV は縦持ちの変更レポートで、結合済みの表やそのまま適用できるパッチではありません。安全な出力は数式に見えるフィールドにアポストロフィを付けるため、出力文字列が変わります。元の文字列での出力は数式を実行させる危険があり、CSV の引用符だけでは防げません。表計算ソフトによって解釈も異なります。 before_present と after_present でセルの不在と空文字列を区別します。表計算ソフトで保存して開き直すとアポストロフィの対策が失われる場合があり、どのソフトでも安全な CSV 出力は保証できません。 差分 CSV は影響を受けるセルごとに1レコードを出力し、追加・削除行では存在する各セルを含めます。変更なしの行は JSON だけに残ります。JSON の null はセルの不在を表し、文字として入力された null は文字列のままです。 データ行がない表で列構造だけが変わった場合、差分 CSV にセルレコードは出ません。完全な列メタデータには JSON を使用してください。
  • セルをテキストとして表示し、HTML、スクリプト、数式を実行しません。入力と結果は消去またはページを閉じるまでページのメモリーにあり、本ツールはアップロードや永続保存を行いません。保存したレポートには非公開データが含まれる可能性があり、ページの管理外に残ります。

よくある質問

キーの選び方と重複キーの解決方法は?

両側にあり、1件を一意に識別できる列を選びます。注文には order_id、倉庫別在庫には warehouse と sku の組み合わせが使えます。並べ替え後の連番は次の出力で別のレコードを指す可能性があり、通常は適切なキーではありません。 同じキーが複数行にあると、対応関係を一意に決められません。診断には対象の側と1から始まるデータ行番号を示します。解析エラーはヘッダーを含む CSV レコード番号を使うため、複数行フィールドがあると実際のテキスト行番号と異なる場合があります。必要なキー列を追加するか、元データの重複を意図に沿って整理してから再実行してください。空白除去や大文字小文字の無視で、新たな重複が生じることもあります。

区切り文字、列順、文字コードが異なっても比較できますか?

できます。両側の入力設定は独立しています。たとえば UTF-8 のカンマ区切りと、対応する UTF-16 のタブ区切りを比較できます。ヘッダーがあれば列順に関係なく名前の完全一致で照合しますが、翻訳、空白除去、列名変更の推測はしません。

空白や大文字小文字を無視すると元データが変わりますか?

相等判定とキーの照合だけが変わります。JSON の変更前後の値には解析後の元の文字列が残ります。キーにも適用されるので、重複が生じないか確認してください。ヘッダーは引き続き完全一致が必要です。

元の値やセルの不在を保持できる出力はどれですか?

元の文字列や構造上の区別を残すなら JSON を使います。差分 CSV は JSON 配列のキーを持つ縦持ちの変更レポートです。表計算ソフトではアポストロフィによる数式対策を有効にしてください。元の文字列を出す CSV は数式として解釈される可能性があるため、評価済みの利用先に限って使ってください。 空文字列は存在する列の値ですが、列がないことは構造上の違いです。レポートはこの区別を保ち、追加・削除列を示し、対応する行のセル差分にも含めます。暗黙に同じものとして扱いません。

関連ツール