Làm cách nào để loại bỏ các dòng trùng lặp trong Visual Studio Code?


117

Giả sử bạn có văn bản sau:

abc
123
abc
456
789
abc
abc

Tôi muốn xóa tất cả các dòng "abc" và chỉ giữ lại một dòng. Tôi không ngại phân loại. Kết quả sẽ như thế này:

abc
123
456
789

Câu trả lời:


223

Nếu thứ tự của các dòng không quan trọng

Sắp xếp các dòng theo thứ tự bảng chữ cái, nếu chúng chưa có và thực hiện các bước sau:
(dựa trên câu hỏi liên quan này: Làm cách nào để tìm và xóa các dòng trùng lặp khỏi tệp bằng Biểu thức chính quy? )

  1. Control+F

  2. Chuyển đổi "Chế độ thay thế"

  3. Chuyển đổi "Sử dụng Cụm từ Thông dụng" (biểu tượng có .*biểu tượng)

  4. Trong trường tìm kiếm , nhập^(.*)(\n\1)+$

  5. Trong trường " thay thế bằng ", nhập$1

  6. Nhấp vào nút Replace All("Thay thế Tất cả").

Nếu thứ tự của dòng quan trọng, do đó bạn không thể loại

Trong trường hợp này, hãy sử dụng giải pháp bên ngoài Mã VS (xem tại đây ) hoặc - nếu tài liệu của bạn không quá lớn và bạn không ngại gửi thư rác vào nút Thay thế Tất cả - hãy làm theo các bước trước, nhưng trong các bước 4 và 5, nhập những điều này:
(dựa trên Xóa các dòng trùng lặp cụ thể mà không cần sắp xếp )

Thận trọng: Chặn tệp có quá nhiều dòng (hơn 1000); có thể gây ra lỗi cho VS Code; có thể giới thiệu dòng trống trong một số trường hợp.

  • tìm kiếm :((^[^\S$]*?(?=\S)(?:.*)+$)[\S\s]*?)^\2$(?:\n)?

  • thay thế bằng :$1

và sau đó nhấp vào nút "Thay thế Tất cả" nhiều lần nếu có sự xuất hiện trùng lặp .

Bạn sẽ biết nó là đủ khi số lượng dòng ngừng giảm khi bạn nhấp vào nút. Điều hướng đến dòng cuối cùng của tài liệu để theo dõi điều đó.


4
((^[^\S\r\n]*?(?=\S)(?:.*)+$)[\S\s]*?)^\2$(?:\r?\n)?khiến vscode của tôi bị lỗi .... Tôi đã thực hiện Tìm trong một tệp 229 dòng. :(
Hickory420

@ Hickory420 Tôi đã thử nghiệm trong máy của mình với 1000 dòng (dài 20 ký tự, ngẫu nhiên) và không gặp sự cố, nhưng thực sự là một khối luồng với 100% tải cpu trong vài giây ở mỗi lần vượt qua. Vâng, điều này hầu như không thực tế đối với các tệp lớn.
Marc.2377

Cảm ơn vì điều đó. Bạn có thể vui lòng giải thích regex ^(.*)(\n\1)+$. Sau khi loại bỏ các hàng trùng lặp, tôi muốn xem tất cả các hàng có cột đầu tiên trùng lặp trong csv và muốn sửa đổi regex.
Urvah Shabbir

1
Chà, tôi cảm thấy mình khá giỏi về regex và điều này vẫn khiến tôi suy nghĩ, câu trả lời tuyệt vời !!
electrovir

@UrvahShabbir, giải thích cho đoạn regex đó được đưa ra trong phần Hỏi và Đáp được liên kết . Của tôi chỉ khác ở chỗ, một \r?chút từ câu trả lời khác là không thực sự cần thiết.
Marc.2377

65

Đây là một phần mở rộng rất thú vị: Transformer

Đặc trưng:

  • Dòng duy nhất
  • Các dòng duy nhất làm tài liệu mới
  • Lọc dòng
  • Lọc dòng dưới dạng tài liệu mới
  • Sắp xếp dòng
  • Sắp xếp dòng theo độ dài
  • Căn chỉnh với con trỏ
  • Căn chỉnh CSV
  • CSV nhỏ gọn
  • Sao chép sang tài liệu mới
  • Chọn dòng
  • Dòng dưới dạng JSON
  • Cắt đường
  • Đếm các dòng trùng lặp làm tài liệu mới
  • Macro

Để xóa các dòng trùng lặp:

  • Loại bỏ các dòng trùng lặp khỏi tài liệu

  • Hoạt động trên lựa chọn hoặc khối hiện tại nếu không có lựa chọn

Tôi đã không chơi với nó nhiều ngoài lệnh "Unique Lines" nhưng nó có vẻ được thực hiện khá tốt (bao gồm cả việc thử ghi macro!).


25

Để thêm vào câu trả lời của @ Marc.2377.

Nếu thứ tự quan trọng và bạn không quan tâm đến việc bạn chỉ giữ lại dòng cuối cùng của các dòng trùng lặp, chỉ cần tìm kiếm regexp sau nếu bạn chỉ muốn xóa các dòng không trống trùng lặp

^(.+\n)(?=(?:.*\n)*?\1)

Nếu bạn cũng muốn xóa các dòng trống trùng lặp, hãy sử dụng *thay thế+

^(.*\n)(?=(?:.*\n)*?\1)

và thay thế bằng không.

Ảnh chụp màn hình của hộp tìm kiếm và thay thế đã lấp đầy

Thao tác này sẽ mất một dòng và cố gắng tìm thêm một số dòng (có thể là 0) tiếp theo là dòng chính xác đã lấy. Nó sẽ loại bỏ dòng đã lấy.

Đây chỉ là một bức ảnh regex. Không cần phải spam nút thay thế.


Ngắn gọn độc đáo
angus l

4
Đẹp. Tôi khuyên bạn nên ^(.+\n)(?=(?:.*\n)*?\1)thay thế vì regex của bạn đã xóa một dòng trống mà nó không được mong đợi. Vẫn ủng hộ.
Marc.2377

Bắt tốt… OTOH: các dòng trống trùng lặp cũng trùng lặp;)
Skeeve

1
@Skeeve Nào, đây chỉ là một chút cảm ơn vì câu trả lời hữu ích của bạn & Tất cả vì cộng đồng tốt hơn :)
Zaman

1
xxx(?=…)là một trận đấu nhìn trước. Vì vậy, nó đảm bảo rằng bất cứ điều gì theo sau "xxx" khớp với "…", nhưng không nâng cao tìm kiếm. (?:…)chỉ là một dấu ngoặc không được tính trong số lượng dấu ngoặc. .*\nlà một mẫu cho một dòng (có thể trống). *nghĩa là có thể có vài dòng, thậm chí không có dòng nào. Các ?sau dấu hoa thị ( *) phương tiện mà chúng tôi muốn là vài dòng càng tốt. Như \1sau biểu thức này, hiệu quả là chúng ta nhìn trước tất cả các dòng không khớp \1cho đến khi chúng tôi tìm thấy một dòng khớp \1. Tôi hy vọng điều này làm cho nó rõ ràng.
Skeeve

22

Tôi vừa gặp sự cố tương tự và tìm thấy gói Visual Studio Code "Sắp xếp dòng". Xem thị trường Mã Visual Studio để biết chi tiết (ví dụ: Sắp xếp các dòng ).

Gói này có tùy chọn "Sắp xếp dòng (duy nhất)", đã làm điều đó cho tôi. Chú ý đến bất kỳ khoảng trắng nào ở đầu / cuối dòng. Chúng ảnh hưởng đến việc các dòng được coi là duy nhất hay không.


marketplace.visualstudio.com/… cũng sẽ hoạt động.
kcpr

1
Có vẻ như tiện ích mở rộng không còn khả năng xóa các mục nhập trùng lặp. Kết hợp nó với câu trả lời của @ Marc-2377 dường như là một mẹo cho tôi.
Dan Atkinson

12

Cài đặt tiện ích mở rộng DupChecker , nhấn F1và nhập "Kiểm tra trùng lặp".

Nó sẽ kiểm tra các bản sao và hỏi bạn có muốn xóa chúng hay không.


11

Hãy thử tìm và thay thế bằng một biểu thức chính quy .

  • Tìm thấy: ^(.+)((?:\r?\n.*)*)(?:\r?\n\1)$

  • Thay thế: $1$2

Có thể đưa ra một số phương sai trong nhóm đầu tiên.


-3

Không thực sự trong Visual Studio Code, nhưng nếu nó hoạt động, nó hoạt động.

  1. Mở một bảng tính Excel mới
  2. Dán dữ liệu vào một cột
  3. Chuyển đến tab Dữ liệu
  4. Chọn cột dữ liệu (nếu bạn chưa có)
  5. Nhấp vào Xóa bản sao (nằm ở giữa thanh)
  6. Nhấp OKđể loại bỏ các bản sao.

Nó không phải là câu trả lời tốt nhất, như bạn đã chỉ định Visual Studio Code, nhưng như tôi đã nói: Nếu nó hoạt động, nó hoạt động :)


Bạn có thể làm cho nó phù hợp hơn bằng cách cung cấp một tập lệnh có thể được gọi trực tiếp từ Visual Studio Code. Nói cách khác, tự động hóa quá trình này. Tôi không biết liệu có thể thực hiện được không, nhưng một tập lệnh sẽ gọi Excel thông qua các giao diện COM lộ ra của nó. Điều này sẽ làm cho câu trả lời này có giá trị hơn nhiều vì nó sẽ là một ví dụ về việc tận dụng các ứng dụng khác để thực hiện những công việc gọn gàng.
Peter Mortensen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.