文字與開發者 指南

文字重複怎麼去除?名單去重、大小寫、空白、保留第一筆與近似重複完整指南

真正危險的不是刪不掉重複,而是沒有先定義『什麼叫同一筆』就直接刪資料。

更新日期:

你有一份名單:

Amy
amy
 Amy
Amy 
Ben

到底有幾個「Amy」?

答案取決於你的去重規則。

速答:文字/名單怎麼安全去重? 先保留原始清單,再定義比較規則:是否忽略大小寫、是否 trim 前後空白、是否保留原始順序,以及只比較「整行」還是某一欄。FunnyTools 移除重複行目前以每一整行為單位,保留第一個出現值,可選擇忽略大小寫、trim 前後空白與排序;它不是模糊比對、Email normalization、CSV 欄位去重或「同一人」辨識工具。

一、第一個問題:什麼叫重複?

最簡單是 exact match:

Amy
Amy

這兩行完全相同。

但:

Amy
amy

是否相同?

要看你是否忽略大小寫。

二、前後空白會不會算不同?

以下看起來一樣:

Amy
 Amy
Amy 

但字串其實不同。

如果啟用 trim,會先去掉前後空白,再比較。

FunnyTools 現行工具預設可用 trim 行為,這對從 Excel、PDF、網頁複製的清單很實用。

三、內部空白不等於前後空白

New York
New  York

中間一個空格和兩個空格可能仍不同。

一般 trim 只處理:

  • 開頭;
  • 結尾。

不應默默把內部所有空白正規化,除非你明確需要。

四、大小寫忽略有什麼代價?

如果忽略 case:

Apple
APPLE
apple

會視為同一值。

這適合:

  • 標籤;
  • 一般關鍵字;
  • 不區分大小寫的代碼。

但不一定適合:

  • case-sensitive username;
  • path;
  • password;
  • 程式識別字。

五、保留第一筆是什麼意思?

假設:

Amy
Ben
amy
Cara

忽略大小寫後,Amyamy 重複。

若策略是「保留第一筆」:

保留最先出現的 Amy

這個行為對順序有意義的名單非常重要。

六、為什麼不要去重後自動排序?

如果清單代表:

  • 優先順序;
  • 報名順序;
  • 路由規則;
  • 執行順序;

排序會破壞語意。

因此去重和排序應是兩個不同決策。

FunnyTools 可選擇排序,但不應預設讓使用者以為「去重一定要排序」。

七、空白行算重複嗎?

FunnyTools 現行移除重複行工具會忽略空白行。

這代表:

Amy

Ben

不會把兩個空白行算成「重複資料筆數」。

如果你真正需要保留 blank row 結構,應使用不同工具或腳本。

八、Exact Duplicate 和 Near Duplicate 不一樣

以下可能是同一人:

王小明
王 小明
Wang Xiaoming

但一般 line dedupe 不知道。

這屬於:

fuzzy matching / entity resolution。

需要更複雜規則,不應讓普通去重工具自動判斷。

九、Email 去重不能只靠整行 lowercase

例如:

[email protected]
[email protected]

不同 email provider、local-part 規則可能不同。

另外:

[email protected]
[email protected]

是否同一信箱取決於 provider 行為與業務規則。

所以 FunnyTools 不應宣稱:

「Email 去重器」。

它只是文字行比較。

十、URL 去重也比看起來複雜

以下 URL 可能指向相同內容,也可能不同:

https://example.com
https://example.com/
https://example.com?utm_source=x

真正 URL canonicalization 需要:

  • scheme;
  • host;
  • path;
  • query;
  • fragment;
  • tracking parameters

的規則。

普通 line dedupe 不應替你猜。

十一、CSV 去重不能用整行工具代替欄位去重

CSV:

email,date
[email protected],2026-01-01
[email protected],2026-02-01

兩行整體不同,但 email 相同。

如果你的需求是「依 email 保留最新一筆」,就需要:

  • column-aware dedupe;
  • date rule;
  • audit。

普通文字行去重做不到。

十二、重複關鍵字清理的安全流程

  1. 保留原始清單。
  2. trim 前後空白。
  3. 決定是否忽略 case。
  4. 去重。
  5. 保留原順序。
  6. 若需要,再另外排序。
  7. 比較去重前後行數。

十三、去重前後要記錄哪些數字?

至少:

  • 原始非空行數;
  • Unique lines;
  • Duplicates removed。

例如:

1000 行 → 920 unique

代表:

移除 80 個後續重複。

這比只看最終結果更容易驗證。

十四、Accent / Unicode 正規化問題

肉眼看起來相同的 Unicode 字串,底層 code point sequence 可能不同。

例如某些 accented characters 可以用:

  • composed form;
  • combining mark。

一般 lowercase / trim 不等於完整 Unicode normalization。

如果資料源很複雜,要先定義 NFC/NFD 等規則。

十五、全形半形也不是普通去重自動處理範圍

例如:

ABC
ABC

肉眼接近,但 code points 不同。

若要統一:

需要 normalization policy。

不要讓工具靜默替你改。

十六、去重的「第一筆」不一定是你真正想保留的

資料庫常需要:

  • 最新一筆;
  • 最完整一筆;
  • 狀態 active 的一筆;
  • priority 最高的一筆。

FunnyTools line dedupe 只保留第一個出現值。

如果要業務規則選 winner:

應使用試算表、SQL 或腳本。

十七、排序前先決定 locale

中文、英文、數字的排序規則不同。

如果去重後要排序:

  • A-Z;
  • Z-A;
  • numeric;
  • length

應依用途決定。

十八、常見錯誤

錯誤 1:沒有備份就直接去重

不可逆風險。

錯誤 2:把不同大小寫一律視為同一筆

可能誤刪。

錯誤 3:去重同時排序

可能破壞順序語意。

錯誤 4:用整行去重處理 CSV 欄位

不是同一需求。

錯誤 5:把近似人名當 exact duplicate

會漏掉或誤刪。

錯誤 6:看到「看起來一樣」就以為 Unicode bytes 一樣

不一定。

十九、快速決策表

需求 方法
完全相同行 Exact line dedupe
忽略大小寫 Case-insensitive option
前後多空白 Trim
保留順序 不排序
依某 CSV 欄位 Spreadsheet / script
近似姓名 Fuzzy/entity matching
Email canonicalization Provider/business rules

二十、FAQ

FunnyTools 保留第一筆還是最後一筆?

現行行為是保留第一個出現值。

可以忽略大小寫嗎?

可以。

前後空白會處理嗎?

可使用 trim 選項。

空白行算重複嗎?

現行工具會忽略空白行。

可以依 CSV 某欄去重嗎?

不行,工具比較整行文字。

可以找近似重複嗎?

不行,這不是 fuzzy matcher。

二十一、延伸閱讀

下一步

要清理關鍵字、路徑或名單? 先決定是否忽略大小寫與空白,再去重;若順序有意義,不要開排序。

重點速記

Original → Trim? → Ignore case? → Keep first → Preserve order → Verify counts