Як я можу видалити повторювані рядки з коду Visual Studio?


118

Скажіть, у вас є такий текст:

abc
123
abc
456
789
abc
abc

Я хочу видалити всі рядки "abc" і просто зберегти один. Я не проти сортування. Результат повинен бути таким:

abc
123
456
789

Відповіді:


223

Якщо порядок рядків не важливий

Сортуйте рядки в алфавітному порядку, якщо їх ще немає, і виконайте наступні дії:
(на основі цього пов'язаного питання: Як знайти та видалити повторювані рядки з файлу за допомогою регулярних виразів? )

  1. Control+F

  2. Увімкніть "Замінити режим"

  3. Увімкніть "Використовувати регулярне вираження" (значок із .*символом)

  4. У полі пошуку введіть^(.*)(\n\1)+$

  5. У полі " замінити на " введіть$1

  6. Клацніть кнопка Замінити все(«Замінити все»).

Якщо порядок рядків є важливим , так що ви не можете сортувати

У цьому випадку або вдайтеся до рішення поза VS Code (див. Тут ), або - якщо ваш документ не дуже великий і ви не проти спамувати кнопку Замінити все - виконайте попередні кроки, але на кроках 4 і 5, введіть наступне:
(на основі Видалення конкретних повторюваних рядків без сортування )

Увага: блоки для файлів із занадто великою кількістю рядків (1000+); може призвести до збою коду VS; може вводити порожні рядки в деяких випадках.

  • пошук :((^[^\S$]*?(?=\S)(?:.*)+$)[\S\s]*?)^\2$(?:\n)?

  • замінити на :$1

а потім натисніть кнопку «Замінити все» стільки разів, скільки є дублікатів .

Ви дізнаєтесь, що достатньо, коли кількість рядків перестане зменшуватися при натисканні на кнопку. Перейдіть до останнього рядка документа, щоб слідкувати за цим.


4
((^[^\S\r\n]*?(?=\S)(?:.*)+$)[\S\s]*?)^\2$(?:\r?\n)?зробив краху vscode .... Я знайшов в одному файлі 229 рядків. :(
Hickory420

@ Hickory420 Я перевірив свою машину на 1000 ліній (завдовжки 20 знаків, випадково) і не зазнав краху, але справді блоки потоків зі 100% завантаженням процесора протягом декількох секунд при кожному проході. Так, це майже не є типовим для великих файлів.
Марк.2377

Дякую за це Можете пояснити, будь ласка, регулярний вираз ^(.*)(\n\1)+$. Після видалення повторюваних рядків я хочу переглянути всі рядки з повторюваним першим стовпцем у csv та хочу змінити регулярний вираз.
Урва Шаббір

1
Нічого собі, я відчуваю, що я досить добре регексую, і це все ще підірвало мій розум, чудова відповідь !!
електровір

@UrvahShabbir, пояснення для цього фрагмента регулярних виразів наведено у пов'язаних запитаннях і запитах . Моя відрізняється лише тим, що \r?біт від іншої відповіді насправді не потрібен.
Марк.2377

66

Ось дуже цікаве розширення: Трансформер

Особливості:

  • Унікальні лінії
  • Унікальні лінії як новий документ
  • Лінії фільтра
  • Лінії фільтра як новий документ
  • Сортувати лінії
  • Сортуйте лінії за довжиною
  • Вирівняти курсор
  • Вирівняйте CSV
  • Компактний CSV
  • Копіювати в новий документ
  • Виберіть Лінії
  • Лінії як JSON
  • Обрізки ліній
  • Зарахуйте повторювані рядки як новий документ
  • Макроси

Для видалення повторюваних рядків:

  • Вилучає з документа повторювані рядки

  • Діє на вибір або поточний блок, якщо вибору немає

Я не грав з цим багато, окрім команди "Унікальні лінії", але це здається досить непогано виконаним (включаючи спробу макрореєстратора!).


26

Щоб додати у відповідь @ Marc.2377

Якщо замовлення важливе і вам не байдуже, що ви просто зберігаєте останній з дублікатів рядків, просто шукайте наступний повторний вираз, якщо ви хочете видалити дублікати непорожніх рядків

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

Якщо ви також хочете видалити повторювані порожні рядки, використовуйте *замість+

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

і замінити нічим.

Знімок екрана заповненого поля пошуку та заміни

Це займе рядок і спробує випереджати ще кілька (можливо, 0) рядків, за якими слід точно вжити той самий рядок. Це видалить взяту лінію.

Це просто одноразовий вираз. Не потрібно спамувати кнопку заміни.


Чудово лаконічний
angus l

4
Приємно. Я рекомендую ^(.+\n)(?=(?:.*\n)*?\1)натомість, тому що ваш регекс видалив порожній рядок там, де цього не передбачалося. Оголошено все одно.
Марк.2377,

Хороший улов ... Ото: повторювані порожні рядки також дублікати;)
Skeeve

1
@Skeeve Давай, це лише невелика подяка за корисну відповідь і все для кращого співтовариства :)
Заман,

1
xxx(?=…)це відповідність. Таким чином, це гарантує, що все, що випливає з "xxx" відповідає "...", але не сприяє пошуку. (?:…)це лише дужка, яка не враховується в кількості дужок. .*\n- це шаблон для (можливо, порожнього) рядка. *означає, що може бути декілька рядків, навіть жоден. В ?після того, як зірочки ( *) означає , що ми хочемо , як кілька рядків , як це можливо. Як \1випливає з цього виразу, ефект полягає в тому, що ми дивимося вперед на всі рядки, які не збігаються, \1поки не знайдемо відповідність рядків \1. Сподіваюся, це дає зрозуміти.
Сків

22

Щойно у мене виникла та сама проблема і я знайшов пакет Visual Studio Code "Сортувати рядки". Детальні відомості див. На ринку коду Visual Studio Code (наприклад, сортування ліній ).

Цей пакет має опцію "Сортування ліній (унікальних)", що зробило це для мене. Подбайте про будь-які пробіли на початку / кінці рядків. Вони впливають на те, чи вважаються лінії унікальними чи ні.


marketplace.visualstudio.com/… також повинен працювати.
kcpr

1
Схоже, що розширення більше не має можливості видаляти повторювані записи. Поєднуючи це з відповіддю від @ Marc-2377, здається, це для мене хитрість.
Ден Аткінсон

12

Встановіть розширення DupChecker , натисніть F1і введіть "Перевірити дублікати".

Він перевірить наявність дублікатів і запитає, чи бажаєте ви їх видалити.



-3

Насправді не в коді Visual Studio, але якщо він працює, він працює.

  1. Відкрийте нову таблицю Excel
  2. Вставте дані у стовпчик
  3. Перейдіть на вкладку Дані
  4. Виберіть стовпчик даних (якщо ви ще цього не зробили)
  5. Натисніть Видалити дублікати (дещо посередині панелі)
  6. Клацніть, OKщоб видалити дублікати.

Це не найкраща відповідь, як ви вказали Код Visual Studio, але як я вже сказав: Якщо він працює, він працює :)


Ви можете зробити це більш актуальним, надавши сценарій, який можна викликати безпосередньо з коду Visual Studio. Для того, щоб сказати слова, автоматизує цей процес. Я не знаю, чи це можливо, але сценарій, який би викликав Excel через відкриті COM-інтерфейси. Це зробить цю відповідь набагато ціннішою, оскільки це буде прикладом використання інших додатків, щоб робити акуратні речі.
Пітер Мортенсен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.