サポートエンジニアがかつて私に尋ねましたなぜ40 人の顧客が更新メールを2 回受け取ったのか 答えは見つけるのに1 時間かかり、完全に平凡でした: キャンペーンリストは1 つのエクスポートを別のエクスポートの下に貼り付けることによって組み立てられ、40 のアドレスは両方に存在していましたチェックすることは2,000 行を目で見るか、またはaを書くことを意味するため、誰もチェックしていませんでした VLOOKUP チームのその半分はそうでした'信頼できません。だから誰もチェックしなかったし、同じ40人がカードに請求されようとしていると2回言われた。
それが、この問題の形です。 2 つのリストの調整は、誰もがデータを使って行う最も一般的なことの 1 つであり、it's は、人々がそれをスキップするか、下手に実行してしまうほど退屈です。本能は通常、差分ツールに手を伸ばし、両方のリストを貼り付け、色付きの出力を目を細めることです。これはすぐに失敗します。なぜなら、差分はあなたが行った質問に答えるからです't 尋ねる。または、スプレッドシートに移動して組み立てを開始します MATCH/COUNTIF 数式は機能しますが、所要時間は 10 分で、アーティファクトを生成します。あなた'再利用することはありません。
実際に必要な操作は名前とit& #39; sは、ツールのいずれかよりも古い: 算術を設定します。 交差、差、連合。 [Toolz.dev] (/とブラウザベースを置く) を構築します リスト比較ツール このガイドは、その下の概念、つまりなぜ順序を無視する必要があるのか、どのような大文字と小文字が静かに壊れるのか、そしてこれと差分をどのように選択するかについてのものです。
tl;dr: 2 つのリストを比較するには、それぞれを順序付けされていないセットとして扱い、交差点 (両方の項目)、2 つの違い (A の項目のみ、B の項目のみ)、および各リスト内の重複を計算します。順序を完全に無視します。行差分は、it's の位置にあるため、間違ったツールです。そのため、リストを再順序付けすると、ほぼすべての行が変更されます。電子メールのような識別子の場合は折りたたみますが、出力には元のテキストを保存し、比較する前に空白をトリミングし、人々が調整するリストは通常顧客データであるため、ブラウザで実行します。
2 つのリストを比較すると、実際にはどのような疑問が解決されるのでしょうか?
名前付き演算が分かると図形が明らかになります リストAとリストBを与えれば:
- 交差点ーwhat& #39; s in both?どのサブスクライバーがまた、顧客を支払っています. which of last month& #39; s SKU are still in this month& #39; s catalogue.
- AマイナスBーwhat' s only in A? which users in the CRM never made it into billing.どのファイルがローカルに存在しますが、サーバー上には存在しません。
- BマイナスAーwhat' sはBのみ? 反対方向にも同じ質問、そしてit' s a ちがう 質問. missing-from-billing と missing-from-CRM は、2 つの異なる原因を持つ 2 つの異なるバグです。
- 対称差ーwhat& #39; sを正確に1 つのリストで? 両方の違いの和集合: 方向に関係なく、一致しなかったすべて これは "what& #39; s 同期がずれている?" 質問です。
- 連合ー どちらかのリストから全て 複製解除 マージ、正しく行いました.
- リスト内で重複しますーwhat& #39; s repeated inside A alone? This one isn't a comparison at all, but it's always the question you turn out to have needed, because it's what causes double-sends and double-billing.この1 つは、比較ではなく、 #39; sは、常に、二重送信と二重請求の原因となる質問です。
最後のものは分離する価値があります。 クロスリストマッチングとリスト内重複は独立しています: アドレスは A に 2 回出現する可能性があります あんど b にも表示されます。クロスリストの結果のみを報告するツールは、コストがかかる障害を見逃します。
ここにあるものはすべて、SQL からすでに知っている操作に直接マップされます - INTERSECT、 EXCEPT、 UNION- そしてスプレッドシートの式に。専用ツールの値は、6 つの異なる式ではなく、1 つのペーストから 6 つの答えすべてが表示される、it't できる限りのことを行うことです。
リストを比較する際に差分ツールが間違った選択になるのはなぜですか?
これは私が最もよく見る間違いであり、それと#39; 正確にする価値があります。なぜなら、" 2 つのリストと比較して引用する;そして " 2 つのファイルを区別して引用する; 同義語のように聞こえるからです。
差分は位置です。 Diff アルゴリズムは、最小編集スクリプト (一方のシーケンスをもう一方のシーケンスに変換する挿入と削除の最短シーケンス) を計算します。 That'これはソース コードと散文の適切なモデルです。39 行に続く 40 行目です 有意義。 関数を移動すると、diff は関数を移動したことを正しく報告します。
リストには意味のある順序がありません。 CRM エクスポートの行 300 は、請求エクスポートの行 300 とまったく関係がありません。彼ら'データベースが返した順序でたまたま書き留められたアイテムの入った 2 つの袋です。
順序付けされていないデータを位置アルゴリズムにフィードするとノイズが発生します。同一の内容を持つ2 つのリストを取り出し、そのうちの1 つをソートし、それらを差分します:
List A List B
alice bob
bob alice
carol carol
Diff がそれを報告しています alice が削除され、再び追加された、またはそれ bob moved - 2 つのソートの違いに比例するいくつかのチャーン 正解は 何も変わらなかった。 すべての項目は両方のリストにあります。セットは等しい。 diff can't は、メンバーシップについて尋ねているため、そう言います。
比較表、ツールは本当に両方を探している人々の心の中で重複しているので:
| リスト 比較 | テキスト差 | |
|---|---|---|
| モデル | 順序付けされていないアイテムのセット | 行の順序付けられたシーケンス |
| 注文は重要ですか? | いいえ、自由に並べ替えてください。結果は同じです | はい - ショーを変更として並べ替えます |
| 答え | メンバーシップ: 両方において、A のみ、B のみ、重複しています | 編集: A を B に変換するために挿入/削除するもの |
| 重複アイテム | グループとして明示的に報告されます | もっとセリフを |
| いいね | エクスポート、電子メール リスト、ID、SKU、在庫の調整 | ソースコード、散文、構成ファイル、位置が意味のあるもの |
| 悪い | ドキュメントの 2 つのバージョンを比較します | ソート順序が任意であるリスト |
ルール: あなた' d 異なる方法で並べ替えられたリストに同様に満足している場合は、設定された比較が必要です。 行の順序を変更することが報告する価値のある本当の変化である場合は、次のことが必要です テキスト差分チェッカー。フラットラインではなくネストされた構造化データの場合、どちらも適用されません - that' s what the json 差分 行やメンバーシップではなく、キーパスで比較されるため、これは賛成です。
症例感受性はどのように機能する必要がありますか?
これは、人々がデフォルトで残し、その後静かに間違ってしまうオプションであるため、it'一度考えてみる価値があります。
大文字と小文字を区別しないマッチングは、ほとんどの人が比較するデータの正しいデフォルトです。 eメールアドレス、ユーザー名、ドメイン名、製品コード、国コード - これらは、実際には従来大文字と小文字を区別しません [email protected] あんど [email protected] 重要なすべてのシステムにおいて同じ人物です。
そこ'ここでは衒学的な注意点があります'それは'時々耐荷重があるため、知っておく価値があります RFC 5321、メールアドレスのドメイン部分は大文字と小文字を区別しませんが、 地元 パート - の前のすべて @ー は形式的には大文字と小文字を区別し、解釈は受信メールサーバに任せます。 というわけで [email protected] あんど [email protected] 原則として異なるメールボックスになる可能性があります。実際には、基本的にすべての主要なプロバイダーがそれらを同一なものとして扱います。メーリング リストの重複を削除する場合は、絶対にケースを折りたたむ必要があります。しかし、特定のアドレスがバウンスする理由をデバッグする場合は、that's が重要であることが判明する詳細情報です。
ケース-敏感 マッチングは、大文字と小文字が情報を運ぶあらゆるものに当てはまります: Linux ファイルパス、base64 文字列、ハッシュ、JWT トークン、API キー、Git SHA、ほとんどのプログラミング識別子 パスワードハッシュのリストに大文字と小文字を折りたたむと、個別の値がマージされ、自信を持って間違った答えが得られます。
オプション自体よりも重要な実装の詳細: マッチング用にケースを折りますが、元のテキストを表示します。 貼り付けたら [email protected] そして、ツールはあなたにそれ& #39; を伝えます。両方のリストで返却する必要があります [email protected]ー じゃない [email protected]。 output を下方ケース化すると、途中でデータが無言で破損し、通常の次のステップでは結果を別の場所に貼り付けることになるため、その破損は進行します。 tool は各アイテムの最初に見える形式を維持し、舞台裏で折りたたまれたキーに一致するため、出てくるのは入力したものになります。
ホワイトスペースも同じ扱いに値し、あまり考えられません。スプレッドシートから列をコピーしたり、次のように行を分割したりできます a, b, c カンマでは、先頭のスペースを持つアイテムが表示されます。 [email protected] あんど [email protected] 異なる文字列と同一のアドレスです。そのため、デフォルトではトリミングがオンになっています。it's オプション you'd は、実際に使用してから約 30 秒以内に欠落していることに気づきます。
どのセパレータを使用すればよいですか?
デフォルトでは、行ごとに 1 つの項目があり、スプレッドシートの列を貼り付けると、クリップボードが改行区切りの値に受け渡されるため、Excel、Google スプレッドシート、または CSV エクスポートからの電子メールの列が再フォーマットされずにドロップインします。
他の区切り文字は、すでにインラインで到着するデータをカバーします。 単一のCSV行またはコピーされた配列のカンマ。 Outlookおよび古いWindowsのアドレスリストの規約のセミコロン。 shell出力用のスペース - ls、 git diff --name-only パイプで通されました tr、スペース区切りのあるものなら何でも。 「スプレッドシートから縦方向ではなく横方向に貼り付けられた行」のタブ。
注意すべきことの 1 つは、コンマでの分割です でないよ CSV解析です。 real CSVフィールドには引用符の中にカンマを含めることができ、ナイーブスプリットは破れます "Smith, Jane" 2 つの項目に. you& #39; re は引用フィールドを持つ本物の CSV ファイルから 1 つの列を引き出す, を通して実行します CSVビューア まず - 実際のRFC 4180 引用符のルールを実装します - その後、必要な列をコピーします。 emailsまたはidsのフラットリストでカンマが埋め込まれていない場合、分割は問題なく、これはdoes& #39; tが上がります。
空のエントリはデフォルトでドロップされます。なぜなら、それらは'ほとんど常にアーティファクトです。ペーストの最後に後続の改行、スプレッドシートの空白行、ダブルカンマです。空の文字列 isn't は、実際に気にしているリスト内のアイテムです。このオプションは、you're がエクスポートで空白行を特に探している場合に存在します。これは、珍しいことではありますが、本当に必要なことです。
比較はどのようにスケールしますか?
2 つのリストを比較する単純なアプローチは、入れ子になったループです。A 内のすべての項目について、B のすべてをスキャンします。O (n×m)、および it' 100 個のアイテムでは問題なく、5 万個では使用できません。ここで、you' は 25 億個の文字列比較を行っています。
右のアプローチは、比較キーによってキー付けされたハッシュ マップに各リストをインデックス付けします - 項目の折り畳まれ、トリミングされた形式 - 値は最初に表示されたオリジナルです。各インデックスを構築すると、1 つの線形パスになります。その後、すべての質問が項目ごとに定数時間のルックアップになります。このキーは B's マップにありますか? 全体の比較は O(n+m) です。これは、各辺の 20,000 個の項目が 40,000 個のハッシュ操作であり、ブラウザが再ペイントできるよりも速く完了することを意味します。
同じインデックスが無料で重複を与えます。 count occurrences per key while building it; any key with a count above one is duplicated within that list. 2 回目のパスも余分な構造もありません。
実際には、上限は isn't 比較 - it's ブラウザは、5 万行の結果グループをテキストエリアにレンダリングします。算術演算は、関係なくミリ秒で終了します。 you're がこれほど大きなリストを日常的に調整している場合、おそらくこれをタブではなくスクリプトに含めたいと考えており、上記のアルゴリズムはどの言語でも約 10 行です。
ソートはメモの価値があります 結果はデフォルトで自然にソートされ、数値を認識することを意味します: item2 前に item10、それの後ではありません。 plain辞書式ソートプット item10 まず なぜなら 1 < 2 文字単位で、ID またはバージョン管理された名前をスキャンするときに、文字列の比較の文字によって正しく、人間のあらゆる期待によって間違っています。並べ替えをオフにすると、挿入順序 (A で最初に表示されたシーケンス内の項目、次に B) が表示されます。これは、元の順序が最新情報などをエンコードするときに、場合によっては必要なものです。
これは実際にはどのように見えますか?
I' が実際に使用した 4 つのシナリオ。それぞれが異なる結果グループにマッピングされます。
送信前にメーリング リストをクリーニングします。 新しいリストと以前に送信されたリストを貼り付けます。 Aのみ 誰が'連絡を受けていますか - それ'あなたの送信リスト。 両方において who'd は複製を取得します。 Aで重複 このページの上部にあるストーリーの 40 人です。そのチェックには 15 秒かかります。そして、it'サポート エンジニアを 1 時間節約できたであろうチェックです。
2 つのシステムを調和させます. CRM から A に、請求から B にユーザー メールをエクスポートします。 Aのみ は signed-up-but-never-billed; bのみ は billed-but-missing-from-crm.これらは2 つの異なるバグです。 1つ目は壊れたウェブフック、2つ目は誰かがフローの外で調達した手動請求書である可能性があります。 1つの"これらのリストは異なります"回答は、まさに両方向が別々に報告される理由である、それを完全に曖昧にするでしょう。
在庫とカタログのドリフト。 先月's 今月に対するSKUエクスポート's. Aのみ は中止、 bのみ は 新しい 、 両方において は引き継がれます。ここでの並べ替え事項 - エクスポートは異なるシステムから異なる順序で出力され、差分はファイル全体を変更されたものとして報告します。
展開の健全性チェック. ステージング上のファイルと本番上のファイルを 2 つから比較します ls スペースセパレーターで貼り付けられた出力。 Aのみ は何hasn& #39; tはまだ出荷されています.
4 つすべてのパターン: 有用な答えはほとんどありません "リストは異なります。 "それ' s どっち アイテム、で どっち 方向 - これはまさに設定された操作によって得られるものであり、類似性スコアまたは差分要約によって得られるもの' t.
リストはどこかにアップロードされていますか?
いいえ、そして、あなたについて少し考えてみましょう'd このようなツールに貼り付けます。
It& #39; s a subscriber export. a list of customer emails. Employee ID. License keys. Account numbers. the lists people reconcile are, by the nature, are close to the most sensitive data an organization holds - you don& #39; t reconcile lists of nothing, you reconcile lists of 人。そして"これら 2,000 通の顧客メールをランダムな Web サイトに貼り付けて、重複がないか確認しましょう"これは、多くの法域で、契約なしで作成したばかりのプロセッサ関係であるため、あなたを冷たく止めるべき文です。
There' s no reason for this computation to touch the network. it' s hash maps over strings - a fewly hundred lines of dependency-free TypeScript. Toolz.dev 上のツールは完全にタブで実行されます; リストはブラウザの JavaScript 文字列です& #39; s メモリと彼らは決してそれを残しません。 nothing is uploaded, logged, or stored. verify it the way you' d verify any such claim: open the network tab and hit Compare, or turn off your wifi and watch it keep working. I& #39; ve written more on why this architecture matters for exactly this class of data in ブラウザベースのツールがサーバー側のツールに勝る理由。
フェイク
2 つのリストを比較して、それらに共通するものを見つけるにはどうすればよいですか?
1 つのリストをリスト A に貼り付け、もう 1 つのリストをリスト B に貼り付けて、「比較」を押します。 "Both" グループは交差点です。両方のリストに存在するすべての項目です。そのグループを独自にコピーしたり、テキスト ファイルとしてダウンロードしたり、コピー レポートですべてのグループを一度にエクスポートしたりできます。注文は重要'重要であるため、リストは同じように並べ替える必要はありません。
リストに含まれるアイテムとは別のリストにはないアイテムを見つけるにはどうすればよいですか?
The "Only in A" and "Only in B" groups answer that, and they're parently separate. a のみでリストBから欠落している項目を保持する; BのみリストAから欠落している項目を保持する.これらは通常、異なる原因を持つ異なる問題である - missing-from-billing and missing-from-CRM aren't the same bug - だからそれらを1 つの答えに折りたたむと必要な情報が失われる。 "Unique" group は対称的な違いが必要な場合、両方を組み合わせる。
単一のリスト内で重複を見つけることができますか?
はい。 A の重複と B の重複は、そのリスト内で複数回表示されるすべての個別の項目をリストします。これはリスト間の照合とは無関係であるため、項目は A で重複することも、B に存在することもできます。 It'リスト内の重複が電子メールの重複や二重請求の原因となるため、通常は実際に最も重要なチェックです。
資本化は比較に影響しますか?
したい場合のみです。 case-sensitive マッチングはデフォルトではオフなので、 [email protected] あんど [email protected] は1 つの項目として扱われます - そして出力はデータを小文字にするのではなく、貼り付けたフォームのどちらかを保持します。 caseが意味を持つ値の場合はオンにします: Linuxパス、base64 文字列、ハッシュ、APIキー、Git SHA.
What'これとテキスト差分ツールの違いは何ですか?
diff は位置です: 1 行目を 1 行目に比較し、1 つのシーケンスを別のシーケンスに変換するために必要な編集を計算するため、リストの順序を変更すると、ほぼすべての行の外観が変更されます。このツールは順序を完全に無視し、各側に項目が存在するかどうかのみ尋ねます。 position が意味であるコードと散文には diff を使用します。 sort 順序が任意であるエクスポートの照合には list compare を使用します。
改行ではなく、コンマで区切られたリストを比較できますか?
はい - 分離器をカンマ、セミコロン、スペース、またはタブに切り替えます。各項目の周囲の空白はデフォルトでトリミングされているためです a, b, c 3 つのクリーンな項目に分割します。 1 つの注意点: コンマでの分割 isn't real CSV 解析。データにコンマを含むフィールドが引用されている場合は、まず適切な CSV ツールを使用して列を抽出します。
何点のアイテムを処理できますか?
比較は、各リストをハッシュマップにインデックスし、入れ子になったループを使用するのではなく、線形時間で実行するため、ミリ秒単位で各側の何万ものアイテムが完成します。実用的な上限は、比較自体ではなく、ブラウザが非常に大きな結果グループをページにレンダリングすることです。
リストはどこかにアップロードされていますか?
いいえ すべての解析と比較はブラウザのJavaScriptとして行われます - 何も送信、ログ、保存されません これはほとんどのツールよりもここで重要です なぜなら、人々が調整するリストは通常、顧客の電子メール、従業員ID、またはライセンスキーを比較しながらネットワークタブを見るか、オフラインになって動作し続けるからです。
関連ツール: テキスト差分チェッカー 注文と位置が重要な場合、 json 差分 構造化データの場合、 CSVビューア 実際の CSV から列を抽出するため、および ワードカウンター 簡単なカウントのために。 さらに読む: ブラウザベースのツールがサーバー側のツールに勝る理由 あんど Web 開発者のツールキット。



