Bagaimana cara menghapus baris duplikat dalam kode Visual Studio?

118

Katakanlah Anda memiliki teks berikut:

abc
123
abc
456
789
abc
abc

Saya ingin menghapus semua baris "abc" dan hanya menyimpan satu. Saya tidak keberatan menyortir. Hasilnya akan seperti ini:

abc
123
456
789
Younes
sumber

Jawaban:

224

Jika urutan garis tidak penting

Urutkan baris menurut abjad, jika belum, dan lakukan langkah-langkah berikut:
(berdasarkan pertanyaan terkait ini: Bagaimana cara menemukan dan menghapus baris duplikat dari file menggunakan Ekspresi Reguler? )

  1. Control+F

  2. Alihkan "mode ganti"

  3. Alihkan "Gunakan Ekspresi Reguler" (ikon dengan .*simbol)

  4. Di bidang pencarian , ketik^(.*)(\n\1)+$

  5. Di kolom " ganti dengan ", ketik$1

  6. Klik tombol Ganti Semua("Ganti Semua").

Jika urutan garis itu penting maka Anda tidak bisa mengurutkan

Dalam kasus ini, gunakan solusi di luar VS Code (lihat di sini ), atau - jika dokumen Anda tidak terlalu besar dan Anda tidak keberatan melakukan spam pada tombol Ganti Semua - ikuti langkah sebelumnya, tetapi di langkah 4 dan 5, masukkan ini:
(berdasarkan Hapus baris duplikat tertentu tanpa penyortiran )

Perhatian: Memblokir file dengan terlalu banyak baris (1000+); dapat menyebabkan VS Code rusak; mungkin memperkenalkan baris kosong dalam beberapa kasus.

  • cari :((^[^\S$]*?(?=\S)(?:.*)+$)[\S\s]*?)^\2$(?:\n)?

  • ganti dengan :$1

dan kemudian klik tombol "Ganti Semua" sebanyak ada kejadian ganda .

Anda akan tahu itu cukup ketika jumlah baris berhenti menurun saat Anda mengklik tombol. Arahkan ke baris terakhir dokumen untuk mengawasinya.

Marc. 2377
sumber
4
((^[^\S\r\n]*?(?=\S)(?:.*)+$)[\S\s]*?)^\2$(?:\r?\n)?membuat vscode saya crash .... Saya melakukan Find dalam satu file 229 baris. :(
Hickory420
@ Hickory420 Saya menguji di mesin saya dengan 1000 baris (panjang 20 karakter, acak) dan tidak mengalami crash, tetapi memang sebuah thread memblokir dengan 100% cpu load selama beberapa detik di setiap lintasan. Ya, ini hampir tidak praktis untuk file besar.
Marc. 2377
Terima kasih untuk ini. Bisakah Anda menjelaskan regex ^(.*)(\n\1)+$. Setelah menghapus baris duplikat saya ingin melihat semua baris dengan kolom pertama duplikat di csv dan ingin memodifikasi regex.
Urvah Shabbir
1
Wow, saya merasa cukup ahli dalam regex dan ini masih membuat saya terkesima, jawaban yang bagus !!
electrovir
@UrvahShabbir, penjelasan untuk bagian regex tersebut diberikan dalam Tanya Jawab yang ditautkan . Punyaku hanya berbeda karena \r?sedikit dari jawaban lain tidak terlalu diperlukan.
Marc. 2377
66

Ini ekstensi yang sangat menarik: Transformer

Fitur:

  • Garis Unik
  • Garis Unik Sebagai Dokumen Baru
  • Garis Filter
  • Filter Garis Sebagai Dokumen Baru
  • Sortir Garis
  • Sortir Garis Berdasarkan Panjang
  • Sejajarkan Dengan Kursor
  • Sejajarkan CSV
  • CSV kompak
  • Salin Ke Dokumen Baru
  • Pilih Garis
  • Baris Sebagai JSON
  • Garis Potong
  • Hitung Garis Duplikat Sebagai Dokumen Baru
  • Makro

Untuk menghapus garis duplikat:

  • Menghapus garis duplikat dari dokumen

  • Beroperasi pada pemilihan atau blok saat ini jika tidak ada pilihan

Saya belum banyak bermain dengannya selain perintah "Unique Lines" tetapi tampaknya dilakukan dengan cukup baik (termasuk mencoba perekam makro!).

Menandai
sumber
26

Untuk menambah balasan @ Marc.2377.

Jika urutannya penting dan Anda tidak peduli bahwa Anda hanya menyimpan baris duplikat terakhir, cukup cari regexp berikut jika Anda hanya ingin menghapus baris duplikat yang tidak kosong

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

Jika Anda juga ingin menghapus baris kosong duplikat, gunakan *bukan+

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

dan ganti dengan apa-apa.

Tangkapan layar dari kotak telusur-dan-ganti yang terisi

Ini akan mengambil satu garis dan mencoba untuk menemukan lebih banyak lagi (mungkin 0) garis yang diikuti oleh garis yang sama persis dengan yang diambil. Ini akan menghapus garis yang diambil.

Ini hanyalah regex sekali pakai. Tidak perlu mengirim spam tombol ganti.

Skeeve
sumber
Sangat ringkas
angus l
4
Bagus. Saya merekomendasikan ^(.+\n)(?=(?:.*\n)*?\1)sebaliknya karena ekspresi reguler Anda menghapus baris kosong yang tidak diharapkan. Tetap diberi suara positif.
2377
Tangkapan yang bagus… OTOH: duplikat baris kosong juga merupakan duplikat;)
Skeeve
1
@Skeeve Ayo, ini hanya sedikit terima kasih atas jawaban Anda yang bermanfaat & Semua untuk komunitas yang lebih baik :)
Zaman
1
xxx(?=…)adalah pertandingan yang mirip. Jadi itu memastikan bahwa, apa pun yang mengikuti "xxx" cocok dengan "…", tetapi tidak melanjutkan pencarian. (?:…)hanyalah braket yang tidak dihitung dalam jumlah braket. .*\nadalah pola untuk baris (mungkin kosong). *artinya mungkin ada beberapa baris, bahkan tidak ada. The ?setelah tanda bintang ( *) berarti kita inginkan sebagai beberapa baris mungkin. Sebagai \1berikut ekspresi ini efeknya adalah kita melihat ke depan untuk semua garis yang tidak cocok \1sampai kita menemukan garis yang cocok \1. Saya harap ini membuatnya jelas.
Skeeve
22

Saya baru saja mengalami masalah yang sama dan menemukan paket Visual Studio Code "Sort lines". Lihat pasar Visual Studio Code untuk rincian (mis. Mengurutkan baris ).

Paket ini memiliki opsi "Sorting lines (unique)", yang melakukannya untuk saya. Jaga ruang putih di awal / akhir baris. Mereka mempengaruhi apakah garis dianggap unik atau tidak.

SimonAx
sumber
marketplace.visualstudio.com/… juga harus berfungsi.
kcpr
1
Sepertinya ekstensi tersebut tidak lagi memiliki kemampuan untuk menghapus entri duplikat. Menggabungkannya dengan jawaban oleh @ Marc-2377 sepertinya berhasil bagi saya.
Dan Atkinson
12

Instal ekstensi DupChecker , tekan F1, dan ketik "Periksa Duplikat".

Ini akan memeriksa duplikat dan menanyakan apakah Anda ingin menghapusnya.

perfecto25
sumber
11

Coba cari dan ganti dengan ekspresi reguler .

  • Temukan: ^(.+)((?:\r?\n.*)*)(?:\r?\n\1)$

  • Menggantikan: $1$2

Dimungkinkan untuk memperkenalkan beberapa varian pada kelompok pertama.

Lavock
sumber
-3

Sebenarnya tidak dalam Visual Studio Code, tetapi jika berhasil, itu berhasil.

  1. Buka spreadsheet Excel baru
  2. Tempel data ke dalam kolom
  3. Buka tab Data
  4. Pilih kolom data (jika Anda belum melakukannya)
  5. Klik Hapus Duplikat (agak di tengah bilah)
  6. Klik OKuntuk menghapus duplikat.

Ini bukan jawaban terbaik, seperti yang Anda tentukan Visual Studio Code, tetapi seperti yang saya katakan: Jika berhasil, itu berhasil :)

NostraDavid
sumber
Anda dapat membuatnya lebih relevan dengan menyediakan skrip yang dapat dipanggil langsung dari Visual Studio Code. Dengan kata lain, otomatiskan proses ini. Saya tidak tahu apakah itu mungkin, tetapi skrip yang akan memanggil Excel melalui antarmuka COM yang terbuka. Ini akan membuat jawaban ini jauh lebih berharga karena akan menjadi contoh pemanfaatan aplikasi lain untuk melakukan hal-hal yang rapi.
Peter Mortensen