文字與開發者 指南
文字重複怎麼去除?名單去重、大小寫、空白、保留第一筆與近似重複完整指南
真正危險的不是刪不掉重複,而是沒有先定義『什麼叫同一筆』就直接刪資料。
更新日期:
你有一份名單:
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
忽略大小寫後,Amy 與 amy 重複。
若策略是「保留第一筆」:
保留最先出現的
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。
普通文字行去重做不到。
十二、重複關鍵字清理的安全流程
- 保留原始清單。
- trim 前後空白。
- 決定是否忽略 case。
- 去重。
- 保留原順序。
- 若需要,再另外排序。
- 比較去重前後行數。
十三、去重前後要記錄哪些數字?
至少:
- 原始非空行數;
- 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