「去重文字」是指從清單中刪除重複的行,同時保留每個唯一值的第一次出現,比較的規則則由可設定的選項控制。實務上,這個任務從每行一個值出發,選取一條比較規則,最後得到一份較短的清單,其中各行依照原本的來源順序排列。第一個符合特定鍵值的行會原封不動地保留,而之後任何具有相同鍵值的行都會被刪除。輸出結果是去掉重複項的輸入內容,而不是經過排序、模糊比對或改寫的版本。無論你是想清理從試算表貼上的欄位、電子郵件行銷活動的標籤清單、SKU 匯出檔、廣告群組的關鍵字組合,或是一小段日誌輸出,工作方式都相同:貼上清單、選擇規則、執行比對、複製結果。移除重複行工具在瀏覽器中完成這項作業而不需上傳資料,並會回報輸入、保留與刪除的數量,讓你能驗證實際的變更。

dedupe text
去重文字:移除重複行的實用指南

「去重文字」的真正含義

「去重文字」是一種狹義操作的簡稱:拿一段以「一行一項」方式整理的純文字,移除在同一份輸入中先前已出現過的每一行。當某個特定鍵值首次出現時,該行會原樣附加。第二次、第三次、以至第十次出現時,後續的行會被刪除。不會進行排序、不會改寫、也不會重新編排。來源順序得以保留,因為演算法從上到下逐一掃描輸入,只會附加未曾見過的第一行。

有三個細節能區分真正的去重與網路上常見的較寬鬆詮釋。第一,去重具有確定性:相同的輸入與相同的選項永遠會產生相同的輸出。第二,去重不會合併相似的值;除非比較規則另有指定,否則「Apple」與「apple」會被視為不同。第三,去重不會挑選「最好」的重複項,而是保留第一個。即使第三次出現的內容恰好最乾淨,工具也不會優先採用它。

了解去重「不是」什麼也很有幫助。它不是詞頻統計、不是模糊比對、不是詞幹化、不是音譯轉換、不是 Unicode 正規化,也不是具語言感知的校對。即使以英文不區分大小寫模式對公司名稱清單進行去重,「Café」與「cafe」仍會被視為不同,因為附加重音符號的字元不屬於英文字母,而小寫化作業並不會將其折疊。

為何逐行比對是標準做法

行是清單、日誌摘錄、貼上的欄位,以及縮減為單一欄位的 CSV 匯出檔的自然單位。每一行都是一個完整的字串,並以換行字元作為結界,去重引擎會逐個讀取這些字串。對於每一行,它會衍生出一個比較鍵,詢問該鍵是否已出現在Set(已見鍵集合)中,接著選擇將原始行附加至輸出,或將其捨棄。Set 是一種讓此操作即便在百萬字元規模下仍能保持快速的資料結構:查詢為常數時間,因此成本隨行數線性成長,而非行數的平方成長。

將原始行與比較鍵分開保存,是讓工具能在不扭曲輸出的前提下,提供大小寫與去除空白選項的設計。比較鍵可以在兩端進行小寫化與去除空白以供比對,但附加至輸出的行仍是原始文字。正是這項區隔保證了去重後的清單仍維持與來源清單相同的可讀性。

如何以三個步驟去重文字

  1. 將每行一個值貼入輸入區。每行會被視為一個項目;空白行也是一個值,而來源順序中第一個出現的空白行將會被保留。
  2. 選擇比對是否忽略英文字母大小寫、邊緣空白、兩者皆忽略,或兩者皆不忽略。嚴格比對會將每一個可見字元都視為有意義,包括行尾空白以及每個字母的大小寫。
  3. 執行工具,讀取回報的輸入、保留與刪除數量,然後將輸出的第一個保留行貼回你的目標位置。如果結果不如預期,請一次調整一個選項並重新執行。

這些數量就是安全檢查。如果你預期只有一筆重複,工具卻回報三筆,那你很可能是將輸入貼了兩次,或是你的來源清單中含有目前的比較規則會將其壓平的隱藏空白。編輯文字或任一選項會清除先前的輸出,因此不會讓陳舊的輸出與當前設定混淆。

嚴格比對與標準化比對一覽

嚴格比對與標準化比對之間的選擇,是你在去重文字時所做的最重要決定,因為它會改變哪些行被視為相等。下表概述每條規則比對了什麼、忽略了什麼。四種模式都會保留原始的第一行於輸出中,並依照來源順序處理各行;只有比較鍵不同。

模式區分大小寫忽略邊緣空白相等配對範例
嚴格是否"apple" 和 "apple"
忽略英文字母大小寫否否"Apple" 和 "apple"
忽略邊緣空白是是" apple" 和 "apple "
兩個選項皆開啟否是" Apple " 和 "apple"

在所有模式中,內部空白與定位字元仍然重要。包含 "a pple" 的行永遠不會等於 "apple",因為比較鍵會看到包含內部字元的完整行。小寫化作業遵循瀏覽器的英文語言環境:德文的 eszett (ß) 不會被折疊為 "ss",附加重音的拉丁字元也不會被折疊為不帶重音的基本形式。當兩個選項皆啟用時,會先進行去除空白,再進行英文語言環境的小寫化,因此作業順序是固定且可預期的。

人們常去重的清單

需要去重的大部分清單都屬於幾種日常情境。從欄位導向的選取範圍複製並貼上的試算表欄位,通常會在底部帶有空白列與重複項。電子郵件行銷活動的標籤會在多個草稿中累積相同的標籤,直到進行一次徹底清理。SEO 或廣告群組用的關鍵字組合以每行一個詞彙的形式呈現,並隨著合併新來源而逐漸累積重複項。從 shell 指令或搜尋結果匯出的檔案名稱,常會在符號連結與解析後路徑同時出現時,把同一個路徑包含兩次。市集整合匯出的 SKU 檔案中,若父項與變體分開列示,可能會讓某個 SKU 出現兩次。日誌值(包括重複的行程 ID、重複的使用者代理、重複的端點名稱)則是源自不同來源但符合相同模式的清單。

在對上述任何一項執行工具之前,請先自問一個問題:來源順序中第一次出現的項目,真的是你想保留的那一個嗎?去重並不會挑選最長的、最新出現的、最頻繁的,或是標準化的形式。它只會保留最先出現的項目。如果你的清單來自舊版匯出與新版匯出的合併,那麼較舊的版本可能會意外勝出,而較乾淨的新紀錄則會被當作重複項捨棄。

需要注意的限制與邊緣情況

「移除重複行」接受最多一百萬個 UTF-16 程式碼單位,並會拒絕跨越該界限的字元。空輸入會被拒絕,以避免產生誤導性的單行結果。行結界以三種形式識別:Windows 的 CRLF、傳統的單一歸位字元,以及單一換行字元。CRLF 配對算作一個結界而非兩個,所以貼上的 Windows 格式清單不會產生多餘的空行。輸出結界會標準化為 LF,因為輸出結果是新產生的純文字字串。輸入中的尾部結界會在去重之前產生一個最終的空行,遵循與其他結界相同的分割規則。

空白行是有效的值,會像其他行一樣進行去重。在嚴格模式下,第一個空行會被保留,後續的空行會被視為重複項而刪除。當啟用邊緣空白去除時,僅包含空白的行與空行會共用同一個trim後的鍵,因此只會保留最先出現的那一個。如果你希望輸出完全不含空白值,請先執行會辨識去除空白的去重作業,再以另一個「移除空行」工具進行額外處理。

此工具不會剖析 CSV 引號、JSON 陣列、程式碼語法或特定語言環境的記錄格式。若貼上的欄位內含位於引號欄位內的逗號,該逗號會被視為值的一部分(這通常是正確的處理方式),但帶引號的 CSV 資料列會以單行呈現,並以單行進行去重。對於商業記錄而言,依可見行進行去重的強度可能不如依穩定的資料庫識別碼去重,因為人工輸入的值容易漂移。在刪除來源資料前請先確認比較規則,並保留原始輸入直到結果核驗無誤。此工具僅處理文字內容,不會變更原始檔案或資料庫。

延伸閱讀:如何在 Excel 資料列中移除重複的詞彙。

延伸閱讀:如何使用空行移除工具處理空白行。