Как удалить повторяющиеся строки в коде Visual Studio?

118

Допустим, у вас есть следующий текст:

abc
123
abc
456
789
abc
abc

Я хочу удалить все строки «abc» и оставить одну. Я не против сортировки. Результат должен быть таким:

abc
123
456
789
Юнес
источник

Ответы:

224

Если порядок строк не важен

Отсортируйте строки в алфавитном порядке, если их еще нет, и выполните следующие действия:
(на основе этого связанного вопроса: как найти и удалить повторяющиеся строки из файла с помощью регулярных выражений? )

  1. Control+F

  2. Переключить "Режим замены"

  3. Переключите «Использовать регулярное выражение» (значок с .*символом)

  4. В поле поиска введите^(.*)(\n\1)+$

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

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

Если порядок строк является важным , так что вы не можете сортировать

В этом случае либо прибегните к решению вне VS Code (см. Здесь ), либо - если ваш документ не очень большой и вы не против спамить кнопку «Заменить все» - выполните предыдущие шаги, но в шагах 4 и 5, введите эти:
(на основе Удалить определенные повторяющиеся строки без сортировки )

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

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

  • заменить на :$1

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

Вы поймете, что этого достаточно, когда количество строк перестанет уменьшаться, когда вы нажмете кнопку. Перейдите к последней строке документа, чтобы следить за ней.

Marc.2377
источник
4
((^[^\S\r\n]*?(?=\S)(?:.*)+$)[\S\s]*?)^\2$(?:\r?\n)?сделал мой сбой vscode .... Я нашел в одном файле 229 строк. :(
Hickory420
@ Hickory420 Я тестировал на своей машине 1000 строк (длина 20 символов, случайный) и не получил сбоев, но действительно поток блокируется со 100% загрузкой процессора в течение нескольких секунд на каждом проходе. Да, для больших файлов это вряд ли практично.
Marc 2377,
Спасибо за это. Не могли бы вы объяснить регулярное выражение ^(.*)(\n\1)+$. После удаления повторяющихся строк я хочу просмотреть все строки с повторяющимся первым столбцом в csv и хочу изменить регулярное выражение.
Урва Шабир
1
Вау, я чувствую, что довольно хорошо разбираюсь в регулярных выражениях, и это все еще взорвало мой мозг, отличный ответ !!
электровир
@UrvahShabbir, объяснение этой части регулярного выражения дается в связанных вопросах и ответах . Мой отличается только тем, что \r?бит из другого ответа на самом деле не нужен.
Marc.2377,
66

Вот очень интересное расширение: Transformer

Особенности:

  • Уникальные линии
  • Уникальные строки как новый документ
  • Линии фильтра
  • Фильтровать строки как новый документ
  • Сортировать строки
  • Сортировать строки по длине
  • Выровнять по курсору
  • Выровнять CSV
  • Компактный CSV
  • Копировать в новый документ
  • Выбрать линии
  • Строки как JSON
  • Линии обрезки
  • Считать повторяющиеся строки как новый документ
  • Макросы

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

  • Удаляет повторяющиеся строки из документа

  • Работает с выбором или текущим блоком, если нет выбора

Я не особо много с ней играл, кроме команды «Уникальные строки», но, похоже, она сделана неплохо (включая попытку записи макросов!).

отметка
источник
26

Чтобы добавить в ответ @ Marc.2377.

Если порядок важен, и вам все равно, что вы просто сохраняете последнюю из повторяющихся строк, просто найдите следующее регулярное выражение, если вы хотите удалить только повторяющиеся непустые строки

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

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

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

и ничего не заменить.

Скриншот заполненного поля поиска и замены

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

Это всего лишь одноразовое регулярное выражение. Не нужно спамить кнопку замены.

Скив
источник
Красиво сжато
angus l
4
Ницца. Я рекомендую ^(.+\n)(?=(?:.*\n)*?\1)вместо этого, потому что ваше регулярное выражение удалило пустую строку там, где этого не ожидалось. Все равно проголосовали за.
Marc.2377,
Хороший улов ... Ото: повторяющиеся пустые строки также дубликаты;)
Skeeve
1
@Skeeve Давай, это небольшое спасибо за твой полезный ответ и все для лучшего сообщества :)
Заман
1
xxx(?=…)является предварительным совпадением. Таким образом, он следит за тем, чтобы все, что следует за «xxx», соответствовало «…», но не продвигает поиск. (?:…)это просто скобка, которая не учитывается при подсчете скобок. .*\nшаблон для (возможно пустой) строки. *означает, что строк может быть как несколько, так и ни одной. Знак ?после звездочки ( *) означает, что нам нужно как можно меньше строк. Как \1следует из этого выражения, мы ищем все строки, которые не совпадают, \1до тех пор, пока не найдем совпадение строк \1. Надеюсь, это проясняет.
Скив
22

У меня была такая же проблема, и я нашел пакет Visual Studio Code «Строки сортировки». Для получения подробной информации см. Рынок Visual Studio Code (например, строки сортировки ).

В этом пакете есть опция «Строки сортировки (уникальные)», которые сделали это за меня. Позаботьтесь о любых пробелах в начале / конце строк. Они влияют на то, считаются ли линии уникальными или нет.

SimonAx
источник
marketplace.visualstudio.com/… также должен работать.
kcpr
1
Похоже, что расширение больше не имеет возможности удалять повторяющиеся записи. Объединение его с ответом @ Marc-2377, кажется, помогает мне.
Дэн Аткинсон
12

Установите расширение DupChecker , нажмите F1и введите «Проверить дубликаты».

Он проверит наличие дубликатов и спросит, хотите ли вы их удалить.

perfecto25
источник
11

Попробуйте найти и заменить регулярным выражением .

  • Найти: ^(.+)((?:\r?\n.*)*)(?:\r?\n\1)$

  • Заменить: $1$2

В первую группу можно внести некоторую дисперсию.

Лавок
источник
-3

На самом деле не в Visual Studio Code, но если это работает, то работает.

  1. Откройте новую таблицу Excel
  2. Вставить данные в столбец
  3. Перейдите на вкладку Data
  4. Выберите столбец данных (если вы еще этого не сделали)
  5. Щелкните Удалить дубликаты (примерно посередине панели).
  6. Щелкните, OKчтобы удалить дубликаты.

Это не лучший ответ, поскольку вы указали код Visual Studio, но, как я уже сказал: если он работает, он работает :)

НостраДэвид
источник
Вы можете сделать его более актуальным, предоставив скрипт, который можно будет вызывать непосредственно из Visual Studio Code. Другими словами, автоматизирует этот процесс. Я не знаю, возможно ли это, но сценарий, который будет вызывать Excel через открытые COM-интерфейсы. Это сделало бы этот ответ гораздо более ценным, поскольку это был бы пример использования других приложений для выполнения изящных задач.
Питер Мортенсен,