Remove Duplicate Lines 是一款以瀏覽器為基礎的文字工具,會保留貼上內容中每一行的第一次出現,並移除所有後續的重複行,設有 1,000,000 個 UTF-16 字碼單位的本機限制,並提供選用的大小寫與邊緣空白切換。演算法會依照原始順序逐行處理,為每一行衍生出比較鍵,再用該鍵與已見過鍵的 Set 進行比對,只附加第一個未出現過的行,因此對於該輸入與所選選項而言,運算結果是確定性的。Rhino 3D 本身內建了 SelDup 指令,可用來捕捉重合的幾何圖形,但 Rhino 工作流程中的文字端也會產生重複的行——例如圖層名稱匯出、腳本的記錄輸出、匯出的識別碼欄位,以及從 Grasshopper 面板複製的標籤清單。將清單貼入輸入區,選擇嚴格或標準化比對,執行工具,讀取輸入、保留與移除的數量以驗證結果,再將去重後的輸出貼回您的 Rhino 檔案或下游文件即可。

何時需要從 Rhino 文字中去重複行
Rhino 3D 主要是一個幾何引擎,但大多數實際專案中,除了曲線與曲面之外,也會伴隨大量純文字往返。會產生重複文字行的常見情況包括:
- 從圖層表匯出或 GetLayerNames 之類的腳本所得到的圖層名稱匯出
- 從 Grasshopper 面板複製的標籤與區塊名稱清單
- 由批次匯出至 DWG、PDF 或 STL 所產生的檔案名稱清單
- 範本檔案中重複出現的材質、剖面線圖樣或標註型式名稱
- 從物件 ID、座標或備註的 CSV 中複製的識別碼欄位
- Grasshopper 定義在每次迭代時將相同值列印到面板所產生的腳本記錄輸出
對於上述每一種情況,實際的問題都相同:文字緩衝區中有一長串清單,卻沒有方便的方式來折疊重複的部分。貼進試算表再與公式搏鬥速度很慢。先排序再以肉眼刪除則容易出錯。將這些行送進本機的逐行去重工具是最乾淨的解法,特別是當檔案存放在一台受到嚴格限制的工作站,或包含您不想上傳到網路服務的識別碼時。
如何在瀏覽器中從 Rhino 移除重複行
這個工作流程很短,且完全留在您的本機上。當您有一份 Rhino 文字清單需要清理時,請依照下列步驟操作。
- 在 Rhino 中執行會產生您文字清單的指令。圖層表匯出、List 輸出、Grasshopper 面板輸出以及腳本主控台記錄都會以純文字形式複製。
- 將清單貼入 Remove Duplicate Lines 工具的輸入區,每行一個值。
- 選擇比對方式:若要嚴格比對,請將兩個選項都保持關閉;或開啟忽略大小寫、忽略邊緣空白,或兩者同時開啟。
- 執行工具。它會依照原始順序逐行處理,為每一行計算出比較鍵,保留鍵值尚未出現的第一行,並以 LF 將倖存的行串接起來。
- 在結果面板中讀取輸入、保留與移除的數量,確認數字符合您預期的結果。
- 複製去重後的輸出,並將其貼回 Rhino、您的腳本、CSV 或下游檔案。
在嚴格與標準化比對之間做選擇
嚴格模式會逐字元精確比對每一完整的行。大小寫、前後空白、Tab 鍵、標點、Unicode 字元以及內部間距全都參與比對。在嚴格比對下,Apple 與 apple 視為相異,而以一個結尾空白結束的行,也會與同樣可見字元但沒有該空白的行視為相異。當空白或大小寫具有意義時——例如 Rhino 中嵌入了材質代碼、視圖名稱,或大小寫具關鍵作用的 Grasshopper 路徑的圖層名稱——這個模式是最安全的選擇。
忽略英文字母大小寫會使用瀏覽器的英文語系小寫化操作來建構比較鍵。它會保留第一次出現時的拼字與大小寫,而不是去改寫輸出。這讓它成為一般英文清單的實用選擇,但它並非口音折疊、轉寫、Unicode 標準化、模糊比對、詞幹化,也不是具語言感知能力的排序。德文的 sharp s 不會自動被視為 ss,而帶口音的字母也會與其無口音的對應字母保持區別。
忽略邊緣空白會在兩端修剪比較鍵。但不會修剪保留下來的輸出。若第一次出現的內容兩側帶有空白,而後續某一行含有同樣的可見值但沒有這些空白,則帶空白的第一次出現會被原樣保留,而後續那行會被移除。內部空白與 Tab 鍵仍然會納入考量。同時啟用大小寫與修剪選項時,會先進行修剪,再進行英文語系的小寫化操作。
| 模式 | 何者視為重複 | 最適合用於 Rhino 文字的情境 |
|---|---|---|
| 嚴格(預設) | 行必須完全相符,包含大小寫與空白 | 大小寫具意義的圖層或材質代碼 |
| 忽略英文字母大小寫 | Apple 與 apple 視為相符 | 人可讀的圖層或標籤名稱 |
| 忽略邊緣空白 | 比對前會去除前導與結尾空白 | 從含有零散填補空白的複製貼上取得的清單 |
| 兩個選項同時啟用 | 先修剪,再轉為小寫 | 大小寫與空白都參差不齊的凌亂匯出 |
此工具對 Rhino 資料能與不能做的事
理解界線才能讓工作保持誠實。對於 Rhino 文字匯出,這個工具會:
- 依照原樣,完整保留每個比較鍵的第一次出現
- 將 Windows 的 CRLF、傳統的 CR 以及 LF 視為行分隔符,且一組 CRLF 會算作單一邊界,而非兩個
- 回報輸入、保留與移除的行數
- 在瀏覽器中全程於本機處理,因此任何清單、記錄或圖層匯出都不會離開您的機器
- 將空行視為有效值;在嚴格比對下,第一個空行會被保留,後續的空行會被視為重複而移除;而在忽略邊緣空白的情況下,僅含空白的行與空行會共用同一個鍵,因此兩者之中只會留下最先出現的那一個
它不會:
- 解析 CSV 引號、JSON 陣列、程式碼語法,或 Rhino 本身具地區特性的記錄格式
- 再次搜尋輸出、合併近似重複、計算詞頻、排序清單,或推斷標頭
- 在多個可能保留的項目中,挑選最新、最長、最常出現或任何其他「最佳」的版本
- 變更原始的 Rhino 檔案或資料庫,因此請務必保留來源圖層表或記錄,直到結果經過檢查為止
輸入上限為 1,000,000 個 UTF-16 字碼單位。剛好等於上限的輸入會被接受,超過一個字碼單位則會在工具切分行或配置比較鍵之前就被拒絕,因此非常大的圖層匯出需要先進行分塊。空輸入會被拒絕,而不會回報一個誤導性的單行結果。編輯文字或任一選項會清除先前的結果,因此陳舊的輸出不會與當前設定混淆。
去重之後:計數與清理步驟
執行完成後,在將結果貼回 Rhino 之前,有幾個快速的檢查可以讓結果更紮實。首先,回顧是否要保留的是第一次出現的那一行。若後續的某個項目已套用過修正,請先排序輸入,或在貼上之前手動編輯;這個工具對於每個比較鍵,一律以第一次出現的那一行為準。其次,決定要如何處理空行。若您的 Grasshopper 記錄或圖層匯出中含有因跳過迭代而產生的空項目,在嚴格模式下,這些項目會因其空鍵而被去重,但仍會出現在輸出中。若輸出不應包含任何空值,請接著使用 Remove Empty Lines 工具。
第三,若匯出內容將兩個識別碼欄位混在同一份貼上內容中,請先使用「Column to Comma Separated List」工具或透過正規表示式將其分開,再進行去重,最後再合併回去。此工具不理解加上引號的 CSV,因此含有逗號的值會被視為包含逗號在內的一行純文字。若要對清理後的清單進行快速的健全性檢查,請執行 Line Counter,如此您就能並排查看總行數、非空行數與空行數,並確認去重後的數字等於輸入減去移除的數量。若您需要確認某個特定識別碼並未消失,請將原始內容與去重後的輸出一起貼入 Compare Two Lists 工具,即可看出究竟移除了哪些項目。
對於多欄位資料,請先思考:以可見的一行作為去重依據,到底是不是正確的規則。對於以文字清單形式匯入 Rhino 的商業記錄,依據穩定的資料庫識別碼進行去重,通常比依據人可讀的標籤進行去重更為可靠。在刪除來源資料之前,請先確認比較規則,並保留原始的 Rhino 檔案,直到清理後的清單經過驗證為止。
如需更深入的說明,請參閱 Remove Duplicate Words in Excel Without Formulas。
如需更深入的說明,請參閱 Remove Empty Lines in Visual Studio Code Safely。