要比對兩份清單是否重複,意思就是把兩份以行為基礎的獨立清單拿出來,找出哪些項目同時出現在兩邊,以及哪些項目只出現在其中一份。最快的做法就是把 A 清單和 B 清單貼進本機端的集合運算工具,選擇是否讓字母大小寫影響成員判定,然後一次讀取五個標示清楚的區塊:同時出現在兩份清單中的項目(也就是重複項)、只出現在 A 的項目、只出現在 B 的項目、兩份清單的聯集,以及對稱差集(恰好只出現在其中一份清單的項目)。每一行經過修剪後的非空行都算一個成員,空白行會被略過,而且每個重複鍵第一次出現的拼法就是顯示出來的那一個。整個運算過程完全在你的瀏覽器中執行,所以資料不會被上傳、儲存,也不會送到任何 AI。限制是每份清單最多一百萬個 UTF-16 字碼單位和 50,000 行,超過任一限制會明確回報錯誤。這個工作流程適用於電子郵件清單、出席名冊、庫存編號、白名單、URL 集合、關鍵字組合,或任何在選定的大小寫規則下,一個實體行等同於一個字面項目的集合比較。

compare two lists for duplicates
在不上傳的情況下比對兩份清單的重複項

單一清單內的重複 vs. 兩份清單之間的重複

「重複」這個詞在不同的情境下可能指兩件不同的事。在單一清單中,重複是指同一個值在該清單中出現兩次或更多次;清理這類重複是單行去重工具的工作,例如 移除重複行的指南,它會保留每一行的第一次出現。在兩份清單之間,重複則是指其成員鍵同時出現在兩份清單中的項目,這正是 比對兩份清單 工具設計來處理的工作。這兩種運算雖然共用「重複」這個詞,但回答的問題不同,用對工具很重要。如果你的目標是在匯入某處之前精簡單一欄位,請使用單一清單去重工具。如果你的目標是將來賓名單與報名匯出檔進行核對、找出同時出現在舊訂閱者和新訂閱者清單中的電子郵件,或比對兩次檔案名稱爬梳結果的重疊情況,就把兩欄都貼進比對工具,然後讀取「同時存在」的區塊。

逐步比對兩份清單的重複項

  1. 在純文字編輯器中準備好 A 清單和 B 清單。每行放一個項目:電子郵件地址、SKU 編號、出席者姓名、URL、檔案名稱,或任何一個行等同於一個比較鍵的字串。
  2. 開啟「比對兩份清單」,把 A 清單貼到 A 清單欄位,把 B 清單貼到 B 清單欄位。請直接從來源貼上,不要重新輸入,這樣才不會因為打錯字而遮蓋真正的重複項。
  3. 選擇大小寫敏感度政策。預設為不區分大小寫,所以 Apple 和 apple 會共用同一個成員鍵。如果要讓「John」和「john」算成不同成員,請切換到區分大小寫。
  4. 點選「比對」。接著會出現五個標示清楚的區塊:同時存在、只存在於 A、只存在於 B、聯集、以及非兩者皆有。「同時存在」就是你要的直接重複答案。
  5. 仔細讀取每個區塊。「同時存在」列出兩份清單中都出現的項目,保留在 A 清單中第一次出現的拼法與順序。「只存在於 A」和「只存在於 B」是方向性的差異。「聯集」包含兩份清單中所有的成員,順序是先依 A 中第一次出現的順序,再加上 B 中新出現的成員。「非兩者皆有」(也就是對稱差集)包含恰好只出現在其中一份清單的項目。
  6. 使用複製動作來複製標示清楚的報告。剪貼簿會收到五個大寫標題,順序固定,內容以 LF 分隔;若某個區塊為空,則會以長破折號取代,以保持缺項的可見性。
  7. 把報告貼到你的目的系統中,並在將任何結果視為權威之前,先驗證字面行的政策。不同的下游系統可能採用不同的標準化規則(Unicode 易混淆字、將電子郵件轉小寫、修剪後的 ID),可能會把工具視為不同的成員合併起來,或把工具視為同一個的成員拆開。

工具回傳的五種檢視

「比對兩份清單」畫面上的五個標籤對應於 MDN 的 JavaScript Set 方法參考Python 內建的 set 型別 中所記載的標準集合運算。每種運算都有精確的意義,並回答你關於這兩份清單的不同問題。

運算工具標籤定義適用情境
交集同時存在鍵同時出現在 A 和 B 中的成員找出兩份清單之間的重複項
A 的差集只存在於 A在 A 中但不在 B 中的成員找出 B 中缺少的項目
B 的差集只存在於 B在 B 中但不在 A 中的成員找出 B 中新出現的項目
聯集聯集兩份清單中所有相異的成員產生一份合併後的唯一清單
對稱差集非兩者皆有恰好只出現在其中一份清單的成員找出任一邊需要關注的項目

如果 A 包含 apple、banana、pear,而 B 包含 banana、peach,那麼「同時存在」的結果就是 banana。「只存在於 A」是 apple 和 pear。「只存在於 B」是 peach。「聯集」是 apple、banana、pear、peach。「非兩者皆有」是 apple、pear、peach。可視化面板和複製的報告使用同一份陣列,所以你讀到什麼,貼上後就是什麼。

大小寫敏感度、空白字元,以及什麼算作重複

工具在比對之前會先標準化每一行。CRLF 和單獨的 CR 行結尾會轉成 LF,前後的空白會被修剪,空白行則會整個略過。行內部的空白在修剪前後會保留下來,所以「Project Alpha」和「Project Alpha」仍然是不同的成員,因為它們內部的間距不同。所選的大小寫規則會一致地套用於去重以及五種運算中的每一種。在不區分大小寫的模式下,Apple 和 apple 會共用一個成員鍵,而第一次出現的拼法(若 A 清單中先出現 Apple,則為 Apple)會顯示在「同時存在」和「聯集」中。在區分大小寫的模式下,同樣的兩行會被視為不同的成員,且都可能出現在結果中。這個工具不會解析 CSV、不會分割逗號、不會標準化 Unicode、不會移除標點符號、不會以數值方式比較數字、不會解析 URL,也不會執行模糊比對。在選定的大小寫規則下,一個實體行就是一個字面項目,所以請規畫你的輸入,使其符合目的系統標準化相同項目的方式。

輸入限制與錯誤處理

每個輸入文字區域的上限是一百萬個 UTF-16 字碼單位和 50,000 行。這些限制可讓分割、建立 map、渲染和剪貼簿輸出在各種瀏覽器中保持可預測性。如果兩份標準化後的清單都為空,或超過任一限制,工具會回傳明確的錯誤,而不是部分結果。這個錯誤不會包含部分報告,因此該次比對會被視為尚未執行。如果你經常達到這些限制,最乾淨的做法就是使用「文字檔分割器」切割清單、逐一比對每一對,再用「文字檔合併器」把標示好的區塊重新合併,這些工具都在本機端執行。編輯任一文字區域會清除先前的結果,所以每次貼上變更後請重新執行比對,以查看更新後的輸出。

重複偵測真正重要的實際情境

兩份清單之間的重複偵測是最常見的資料清理工作之一。以下幾個例子都能妥貼地納入本工具的設計範圍:

  • 電子郵件行銷。把舊的訂閱者匯出檔貼到 A,把新的加入訂閱名單貼到 B。「同時存在」會告訴你哪些人已經在名單上,而「只存在於 B」就是下一波活動中乾淨的全新名單。
  • 庫存與 SKU。把 A 倉庫的庫存編號貼到 A,把 B 倉庫的編號貼到 B。「只存在於 A」是需要調撥的庫存,「只存在於 B」則是已經存在於目的端的庫存。
  • 活動名冊。把報名系統匯出檔貼到 A,把安檢報到名單貼到 B。「同時存在」是所有已報名的人,「只存在於 B」則是臨時到場者或工作人員。
  • 白名單與黑名單。把目前的白名單貼到 A,把候選新增檔案貼到 B。「同時存在」是已經涵蓋的項目,可以跳過;「只存在於 B」才是你真正需要新增的部分。
  • 移轉檢查。把來源系統的 ID 貼到 A,把目的系統的 ID 貼到 B。對稱差集(「非兩者皆有」)會顯示出恰好只存在於一邊的每個 ID,這是當對帳總數對不上時最先要查看的地方。
  • 檔案名稱或 URL 清理。把同一目錄的兩次爬梳結果分別貼到 A 和 B。「聯集」是兩次爬梳中觸及的所有檔案的完整集合,「同時存在」則是重疊的部分。

隱私與本機處理

所有運算都在你的瀏覽器中執行。文字區域、標準化步驟、集合運算、五個面板的渲染,以及剪貼簿寫入,都是在本地裝置上完成的。沒有任何輸入或結果會被上傳、儲存、記錄到比對服務,或送到 AI 模型。剪貼簿寫入是否成功,只有在瀏覽器確認寫入動作之後才會回報;如果瀏覽器拒絕剪貼簿權限,工具會顯示手動複製的指示,而不是假裝複製成功。實作使用的是穩定的 JavaScript map 物件,而不是最新的原生 Set 方法,這樣既避免了瀏覽器相容性的相依性,同時保留了 MDN 和 Python 標準程式庫所記載的相同集合語意。對於涉及敏感清單(例如客戶名冊或內部 ID)的工作來說,純本機設計代表第三方比對服務永遠看不到你資料中的任何一行。