ToolAct工具行動

文字去重工具

快速移除文字中的重複內容,支援按行、按詞、按句去重

輸入文字
去重結果

去重模式

選項設定

統計資訊

原始項目數0
唯一項目數0
重複項目數0

什麼是文字去重?

文字去重工具用來刪除文字中重複的行、詞或項目,讓列表更乾淨、更容易檢查。它適合處理匯入的 CSV 片段、關鍵字列表、信箱集合、日誌片段、商品編碼、提示詞版本和筆記內容,這些重複項常來自複製、合併或匯出錯誤。真正需要注意的是比較規則:大小寫、首尾空格、空行、標點、正規化方式和原始順序都會影響兩個項目是否應被視為相同。工具能加快清理,但不能取代業務判斷;有些相似項目必須保留,小差異也可能代表不同含義。

使用方式

基本操作

  1. 在左側文字框中輸入或貼上要去重的文字
  2. 選擇適當的去重模式(按行、按詞、按句等)
  3. 依需要調整選項(區分大小寫、保留順序等)
  4. 在右側即時查看去重結果與統計資訊
  5. 點選複製按鈕將結果儲存到剪貼簿

模式說明

  • 按行:將每行視為獨立單位,移除重複的行
  • 按詞:以空格分割文字,移除重複的詞
  • 按句:以句號、問號、驚嘆號分割,移除重複的句子
  • 按段落:以空行分割,移除重複的段落
  • 按字元:移除文字中重複出現的字元

使用場景

移除重複的行、詞、句子、段落或字元選擇要去重的單位,工具會保留首次出現的項目並維持唯一項目的順序。每種模式使用不同的拆分和合併策略,因此行、段落、詞和字元的工作流程表現各不相同。雜湊集合的查找時間複雜度為 O(n),即使是很長的清單也能在一次瀏覽器回合內完成去重。
複製前先審計重複項統計資訊會顯示原始數量、唯一數量和被移除的重複數量。可選的重複項顯示功能會列出發現的重複內容,在清理郵件列表、關鍵字列表、日誌或匯出的問卷資料前很有用。先檢視重複清單,確認正確的項目已被合併,再分享清理後的輸出。
控制大小寫敏感的匹配規則當 Apple 和 apple 應被視為不同項目時開啟大小寫敏感;當不論大小寫都應偵測重複時則關閉。這讓同一個工具既能處理一般文字清理,也能處理精確的技術清單。大小寫不敏感模式會先將輸入轉為小寫再進行雜湊,因此冗長的日誌不會將「ERROR」和「error」保留為兩個獨立項目。
清理郵件或標籤清單同時保留順序貼上匯出的郵件列表,切換到行模式並開啟大小寫不敏感匹配,即可合併 [email protected] 和 [email protected]。首次出現的順序會被保留,因此清理後的清單仍維持原始分組順序,適合匯入 CSV。排序穩定性在此很重要:輸出應保留輸入序列,而非按字母重新排列。
去重前先正規化關鍵字集合的空白修剪首尾空白並跳過空行,讓複製貼上時混入的雜散 Tab 不會產生假重複。當來源清單來自試算表匯出,其中的空白列和縮排項目會膨脹重複計數時,這一步驟至關重要。對清理過的清單用更嚴格的規則再跑一次,通常不會再找到衝突,這表示正規化已成功。

技術原理

去重是一次掃描,由 JavaScript Set 支援。ECMAScript Set 使用 SameValueZero 相等演算法(與 Array.prototype.includes 使用的比較方式相同,其中 NaN 等於 NaN 但 +0 等於 -0),且規範要求其提供次線性的平均查找效率 — V8 將其實現為開放定址雜湊表,具有攤銷 O(1) 的插入時間,因此整個掃描的時間複雜度為 O(n)。天真的替代方案 — 推入結果陣列並對每個元素呼叫 indexOf — 時間複雜度為 O(n²),在約一萬筆資料時就會明顯變慢。拆分方式因模式而異:行模式以 /\r?\n/ 拆分以同時處理 CRLF(Windows)和 LF(Unix)換行,詞模式以 /\s+/ 拆分,句模式以 /(?<=[.!?])\s+/ 拆分,段落模式以 /\n{2,}/ 拆分。每個單元在成為 Set 鍵值前會經過可選的正規化處理:trim() 移除首尾空白、toLowerCase() 用於不分大小寫匹配、String.prototype.normalize('NFC') 讓組合形式(é, U+00E9)和分解形式(e + U+0301)的視覺相同字串合併為同一筆。順序保留是免費的:結果陣列按迭代順序建立,Set 僅作為「我是否見過這個?」的過濾器。相同的資料結構選擇也支撐了 SQL DISTINCT 和 Python set();對於數千萬筆資料的唯一替代方案是機率性的布隆過濾器,它以極小的誤陽性率(約 10 bits/元素時 ≈1%)換取固定記憶體,但對瀏覽器端的文字工具而言過於誇張。

  • Set 查找使用 SameValueZero 演算法(ECMA-262 §7.2.10)— NaN 匹配 NaN、+0 匹配 -0,其餘為嚴格相等
  • V8 將 Set 實現為雜湊表;insert 和 has 的攤銷時間為 O(1),使整個去重為 O(n),相較於 indexOf 的 O(n²)
  • 行模式正規表示式 /\r?\n/ 在一次拆分中處理 CRLF、LF 和尾部 CR;忽略此問題會留下看不見的 '\r' 尾綴導致精確匹配失敗
  • 透過 String.prototype.normalize('NFC') 進行 Unicode 正規化,將組合/分解形式(如 'é' U+00E9 對比 'e' + U+0301)合併為同一鍵值
  • 不分大小寫模式僅將鍵值小寫化 — 原始大小寫的值保留在輸出中,因此第一個 'ERROR' 會被原樣保留,後續的 'error' 行則被丟棄
  • 順序保留是免費的:結果陣列按輸入順序建立,Set 僅作為過濾器,行為等同於 SQL DISTINCT 加穩定排序
  • 對於超過一千萬筆資料、記憶體成為瓶頸的場景,布隆過濾器(約 10 bits/元素可達 1% 誤陽性率)可取代 Set — 在瀏覽器中不需要,因為一百萬筆字串的 Set 輕鬆控制在 100 MB 以內

範例

依行去重,保留首次出現

輸入:
apple
banana
apple
orange
banana

輸出:
apple
banana
orange

去除前後空白後依行去重

輸入:
hello
  hello
hello 
world

輸出(去除空白後):
hello
world

不分大小寫去重

輸入:
ERROR
error
Warning
WARNING
warning

輸出(不分大小寫):
ERROR
Warning

擷取唯一電子郵件清單

輸入:
alice@example.com
bob@example.com
ALICE@example.com
carol@example.com
bob@example.com

輸出(不分大小寫,依行模式):
alice@example.com
bob@example.com
carol@example.com

依單字去重

輸入:hello world hello again world

輸出:hello world again

依句子去重

輸入:This is a test. This is a test. Another sentence.

輸出:This is a test. Another sentence.

常見問題

什麼樣的內容會被視為重複?

每個單元(行、單字、句子、段落或字元)會與其他單元互相比對,完全相同的就算重複。可切換是否區分大小寫。本頁會輸出去重後的結果,並回報移除了幾個重複項。

會保留原本順序嗎?

會——每個唯一項目的第一次出現會留在原位置,後續的重複項則被刪除。輸出維持原本的順序。

空白行會被當作重複嗎?

空白行的比對方式與其他行一樣。第一個空白行會保留,後面遇到的相同空白行會與其他重複項一起刪除。

可以依子字串或欄位去重嗎?

不行。去重是針對每個單元(行、單字、句子、段落或字元)的完整內容進行比對,沒有依欄位或子字串去重的模式。

輸出會排序嗎?

不會。輸出始終保留原本順序,沒有排序選項。

可以處理多大的檔案?

瀏覽器的記憶體就是極限。桌上型瀏覽器處理數十萬行不成問題,數百萬行的檔案則會撐爆記憶體;遇到那種規模請改用 CLI 工具,例如 `sort -u` 或 `awk '!seen[$0]++'`。

我的文字會被上傳嗎?

不會。去重使用瀏覽器中的記憶體 Set 結構,貼上的內容不會被傳送出去。