Введите строку символов с клавиатуры и удалите в ней повторяющиеся символы

Обновлено: 04.07.2024

В этом руководстве вы научитесь удалять все дубликаты из заданной строки в Python. Строки в Python — это последовательность символов, заключенная в одинарные, двойные или тройные кавычки. Для данной строки мы должны удалить все символы, которые встречаются в строке более одного раза. Мы будем следить за порядком появления персонажей. Например,

Ввод: "stringis"

Вывод: "строка"

Для решения этой проблемы существует несколько различных подходов,

  1. с использованием функций OrderedDict() и fromkeys()
  2. используя функцию OrderedDict() и метод set

Мы рассмотрим эти подходы отдельно

Подход 1: использование функции OrderedDict()

В этом подходе мы будем использовать метод OrderedDict() из класса collections и fromkeys() в нашей программе.

OrderedDict — это подкласс словаря, который запоминает порядок ключей, которые были вставлены первыми. Поскольку повторяющихся ключей быть не может, этот метод вернет строку после удаления повторяющихся символов.

Алгоритм

Следуйте алгоритму, чтобы лучше понять подход:

Шаг 1. Импорт OrderedDict из класса коллекций

Шаг 2. Определите функцию, которая будет удалять дубликаты

Шаг 3. Объявите строку с символами

Шаг 4. Вызов функции для удаления символов из этой строки

Шаг 5. Распечатайте значение, возвращаемое функцией

Программа Python 1

Посмотрите на программу, чтобы понять реализацию вышеупомянутого подхода.


abcfgbsca
После удаления дубликатов: abcfgs

Подход 2: OrderedDict

В этом подходе мы преобразуем строку в набор с помощью метода set(). Затем мы объявим другую строку и сохраним символы, которых еще нет в строке. Эта новая строка будет содержать результирующую строку.

Алгоритм

Следуйте алгоритму, чтобы лучше понять подход

Шаг 1. Импорт OrderedDict из класса коллекций

Шаг 2. Определите функцию, которая будет удалять дубликаты

Шаг 3. Создайте набор строк и сохраните

Шаг 4. Объявите новую пустую строку

Шаг 5. Запустите цикл и добавьте каждый символ в пустую строку, если он еще не присутствует в строке

Шаг 6. Распечатайте строку

Программа Python 2

Посмотрите на программу, чтобы понять реализацию вышеупомянутого подхода.


stdsrdthw
После удаления: stdrhw

Заключение

В этом руководстве мы обсудили два подхода к удалению дубликатов из строки. Мы также обсудили, как использовать методы класса коллекции и использовать их для удаления дубликатов.

Я пытаюсь перебрать строку, чтобы удалить повторяющиеся символы.

Например, строка aabbccdef должна стать abcdef, а строка abcdabcd должна стать abcd

Вот что у меня есть:

Как это лучше всего сделать?


Вы хотите просто "свернуть" повторяющиеся символы или полностью удалить дубликаты? То есть "абба" должно давать "аба" или "аб"?

49 ответов 49

Преобразуйте строку в массив символов и сохраните ее в LinkedHashSet . Это сохранит ваш заказ и удалит дубликаты. Что-то вроде:

@Rico: Вы также можете сделать это вручную (например, создать массив нужной длины, затем поместить в него все не дубликаты, а затем создать строку из этого), но это просто больше работы, и StringBuilder действительно создан для создания строк.

Использование new StringBuilder(charSet.size()) немного оптимизирует это, чтобы избежать изменения размера StringBuilder .

С помощью Stream это легко сделать.


Попробуйте это простое решение:

Хороший ответ, но каждый раз при запуске += вся строка уничтожается и копируется повторно, что приводит к ненужной неэффективности. Кроме того, проверка длины() строки на каждой итерации цикла приводит к неэффективности. Длина цикла не меняется, поэтому вам не нужно проверять его для каждого символа.

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



Создайте StringWriter. Пройдите исходную строку, используя charAt(i) в цикле for. Сохраняйте переменную типа char, сохраняя последнее значение charAt. Если вы повторяете и значение charAt равно тому, что хранится в этой переменной, не добавляйте в StringWriter.Наконец, используйте метод StringWriter.toString(), получите строку и сделайте с ней то, что вам нужно.

Я пробовал что-то подобное, но не StringWriter.toString(). Первый цикл будет перебирать входную строку, и если этот символ не существует в результирующей строке, то добавлять его. но это не сработало.

Вот улучшение ответа Дейва.

Он использует HashSet вместо немного более дорогого LinkedHashSet и повторно использует буфер символов для результата, устраняя необходимость в StringBuilder .


но вы не можете использовать его, если вход содержит те же элементы или если он пуст!

Это не будет работать в примерах, о которых вы спрашивали в разделе Удаление дубликатов в строке без использования массивов

Код для удаления повторяющихся символов в строке без использования дополнительного буфера. ПРИМЕЧАНИЕ. Можно использовать одну или две дополнительные переменные. Дополнительный массив не является:

Как читать и говорить о приведенном выше коде:

  1. Метод removeDupes принимает массив примитивных символов с именем arr.
  2. arr возвращается как массив примитивных символов "по значению". Переданный arr является мусором, собранным в конце метода removeDupes члена Main.
  3. Сложность этого алгоритма во время выполнения составляет O(n) или, точнее, O(n+(малая константа)) — константа представляет собой уникальные символы во всем массиве примитивных символов.
  4. CopyOfRange не увеличивает значительно сложность среды выполнения, поскольку копирует лишь небольшое постоянное количество элементов. Массив символов с именем arr не проходит через все этапы.
  5. Если передать значение null в метод removeDupes, метод вернет значение null.
  6. Если вы передаете пустой массив примитивных символов или массив, содержащий одно значение, возвращается этот неизмененный массив.
  7. Метод removeDupes работает настолько быстро, насколько это физически возможно, полностью используя кэш L1 и L2, поэтому количество перенаправлений Branch сведено к минимуму.
  8. Ненагруженный компьютер стандартного выпуска 2015 года должен быть в состоянии выполнить этот метод с примитивным массивом символов, содержащим 500 миллионов символов, за время от 15 до 25 секунд.

Объясните, как работает этот код:

Первая часть передаваемого массива используется в качестве хранилища уникальных символов, которые в конечном итоге возвращаются. В начале функции ответ: "символы от 0 до 1", как от 0 до хвоста.

Мы определяем переменную y вне цикла, потому что хотим найти первое место, где искомый индекс массива был дублирован в нашем репозитории. Когда дубликат найден, он разрывается и завершает работу, y==tail возвращает false, и репозиторий не добавляется.

когда индекс x, который мы просматриваем, не представлен в нашем репозитории, мы извлекаем его и добавляем в конец нашего репозитория в конце индекса и хвосте приращения.

В конце мы возвращаем массив между точками 0 и хвостом, который должен быть меньше или равен по длине исходному массиву.

Упражнение по темам для обсуждения на собеседованиях с программистами:

Будет ли программа вести себя иначе, если вы измените y++ на ++y? Почему или почему бы и нет.

Представляет ли копия массива в конце еще один проход 'N' через весь массив, создавая сложность выполнения O(n*n) вместо O(n)? Почему или почему бы и нет.

Можете ли вы заменить двойное равенство при сравнении примитивных символов на .equals? Почему или почему бы и нет?

Можно ли изменить этот метод, чтобы замены выполнялись "по ссылке", а не "по значению", как сейчас? Почему или почему бы и нет?

Можно ли повысить эффективность этого алгоритма, отсортировав хранилище уникальных значений в начале 'arr'? При каких обстоятельствах это было бы более эффективно?

Удаление повторяющихся символов

В этом сообщении блога мы собираемся решить задачу очистки данных по удалению нежелательных повторяющихся символов в символьных переменных SAS.

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

Примеры повторения символов

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

Настройка свойств клавиатуры

Совет. Вы можете настроить свойства клавиатуры, чтобы управлять параметрами «Задержка повтора» и «Частота повторения» (на компьютере с ОС Windows выполните поиск «Клавиатура» и нажмите «Клавиатура» на панели управления).

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

Удаление повторяющихся пробелов

В SAS есть очень полезная функция COMPBL(), которая удаляет несколько последовательных пробелов из строки символов, заменяя их одним пробелом.

Давайте воспользуемся функцией COMPBL в качестве прототипа и создадим собственную определяемую пользователем функцию, которая будет делать то же, что COMPBL делает с пробелами, но расширит ее функциональность на другие символы.

Удаление повторяющихся символов — прототип

На основе подхода, описанного в сообщении блога Удаление нежелательных символов из текстовых строк компанией Amadeus Software, мы разработали прототип с использованием функции TRANWRD(), которая заменяет любые два одинаковых символа одним. Вместо того, чтобы создавать функцию для замены определенного символа и вызывать ее рекурсивно, мы поместили функцию TRANWRD в цикл, который повторяется до тех пор, пока не будут найдены любые два повторяющихся символа. Вот код, иллюстрирующий этот подход:

Определяемая пользователем функция SAS для удаления повторяющихся символов

  1. str – указывает символьную константу, переменную или выражение, из которых необходимо удалить повторяющиеся символы, заменив их одним символом;
  2. clist — это константа, переменная или символьное выражение, которое определяет (списывает) все символы, которые вы хотите исключить из строки.

Следующий код создаст такую ​​функцию:

Подсветка кода

  • Мы вводим промежуточную переменную x, к которой будем итеративно применять замену двойных символов одним.
  • Мы присваиваем атрибуту длины этой переменной максимально допустимую длину символа 32767 байт, чтобы обеспечить любую длину символа, используемую в вызывающей программе.
  • Внешний цикл do-loop проходит по списку, содержащему символы, которые мы хотим исключить из дублирования.
  • Переменной c присваивается один символ из clist, переменной cc присваивается двойное значение cc.
  • Внутренний цикл do-loop повторяет обрезанные символы в x до тех пор, пока не будут найдены двойники; использование trim(x) важно, так как оно не только ускоряет обработку при поиске в более короткой строке (без завершающих пробелов), но также предотвращает попадание в бесконечный цикл в случае, если clist содержит пустой символ для удаления дубликатов (cc равно двойным пробелам, которые всегда будут находиться среди завершающих пробелов).

Давайте протестируем нашу новую функцию UNDUPC на следующих данных:

Поскольку наша определяемая пользователем функция постоянно хранится в месте, указанном в опции outlib= процедуры fcmp, теперь мы можем легко использовать ее в любом сеансе SAS, как показано в следующем примере:

Этот код удалит и заменит все повторяющиеся последовательности символов ' ', ',', '"', ']' и '['. Порядок из этих символов, перечисленных во втором аргументе, не имеет значения. Вот что мы получаем:

Результаты удаления повторяющихся символов


Как видите, мы получили то, что хотели, включая функциональность функции COMPBL.

Определяемая пользователем процедура CALL для удаления любых повторяющихся символов

Как бы я ни любил определяемые пользователем функции, у меня есть проблема с реализацией описанной выше пользовательской функции undupc. Это связано с тем, как PROC FCMP обрабатывает назначение атрибутов длины промежуточных символьных переменных. Он не наследует неявно их атрибут длины от другой переменной, как это делает шаг данных SAS. Например, если вы выполните следующий шаг данных:

переменная y будет иметь атрибут длины $99, неявно унаследованный от переменной x.

В функции PROC CFMP вы можете либо присвоить атрибут длины символьной переменной явно с оператором LENGTH или ATTRIB (как мы сделали, используя length x $32767 ), либо для него будет установлено значение $33. если вы используете любой другой способ неявного назначения. (Я оставляю вам догадываться, почему 33, а не любое другое число.) Поскольку мы хотели разместить символьные строки SAS любой длины, нам пришлось явно присвоить атрибуту длины промежуточной переменной x максимально допустимое значение $32767. Это неизбежно скажется на производительности функции, так как нам придется обрабатывать более длинные строки.

Однако мы можем избежать этой проблемы, используя вместо этого процедуру CALL:

Этот код очень похож на пользовательскую функцию выше с небольшим отличием. Здесь переменная x указана в качестве аргумента в определении подпрограммы и относится к переменной шага данных SAS, атрибут длины которой назначается в вызывающем шаге данных. В отличие от функции SAS, подпрограмма SAS не возвращает значение; вместо этого он использует оператор OUTARGS, который указывает аргументы в списке аргументов, которые вы хотите, чтобы подпрограмма обновляла. Поэтому нам не нужно присваивать атрибут длины x внутри подпрограммы, мы просто помещаем x в оператор OUTARGS. Вот как вы могли бы вызвать пользовательскую подпрограмму CALL вместо функции:

Обратите внимание, что теперь мы контролируем и определяем атрибут длины третьего аргумента в вызывающей программе, а не в самой процедуре CALL. И мы получаем те же результаты, что и с функцией UNDUPC выше.

Хранить пользовательские функции и подпрограммы отдельно

Вы можете создавать и иметь как пользовательскую функцию, так и процедуру вызова с одним и тем же именем. Однако во избежание путаницы (и ошибок) не храните их определения в одной таблице данных (опция outlib= PROC FCMP). Если они хранятся в одной таблице данных, то при использовании на шаге DATA SAS будет извлекать последнее определение только по его имени, и это может быть не тот объект, который вам нужен.

Сравнение эффективности

Для сравнения производительности функции UNDUPC и подпрограммы UNDUPC мы создали довольно большую таблицу данных (1 миллион наблюдений) со случайно сгенерированными строками (длиной 1000 символов):

Затем мы выполнили следующие 2 шага данных, один с использованием функции undupc(), а другой с помощью подпрограммы вызова undupc():

Быстрая проверка журнала SAS показывает, что CALL UNDUPC работает в 3 раза быстрее, чем функция UNDUPC (10 секунд против 30 секунд). Экономия времени может варьироваться в зависимости от состава ваших данных и вычислительной среды, но в любом случае, если вы обрабатываете большие объемы данных, вы можете рассмотреть возможность использования подпрограммы CALL вместо функции CALL. Это не общее утверждение, так как оно относится только к этому конкретному алгоритму устранения повторов символов, когда нам приходилось явно присваивать максимально возможное значение атрибута длины промежуточной переменной в функции, но не в подпрограмме CALL.

Когда мы уменьшили заявленную длину x с 32767 до 1000 долларов США в определении пользовательской функции, ее производительность стала на уровне процедуры CALL.

Дополнительные ресурсы для обработки символьных строк SAS

Ваши мысли?

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

Об авторе

Леонид Батхан — независимый консультант SAS и блоггер. Он имеет докторскую степень. в области компьютерных наук и систем автоматического управления и является пользователем SAS более 25 лет. С 1995 по 2021 год работал консультантом по управлению данными и бизнес-аналитике в SAS Institute. За свою карьеру Леонид успешно реализовал десятки SAS-приложений и проектов в различных отраслях. Все посты Леонида Батхана >>>

22 комментария


Леонид Это здорово. Спасибо, что поделился!! Вопрос: если список clist заканчивается пробелами, функция не очищает повторяющиеся пробелы, в чем причина?

Привет, Оскар, отличное наблюдение. Алгоритм перебирает символы в CLIST от позиции 1 до LENGTH(CLIST). Функция LENGTH(CLIST) возвращает целое число, представляющее позицию самого правого непустого символа в CLIST. Конечный пробел рассматривается как конечный пробел и поэтому удаляется из рассмотрения. Если вы хотите включить пробел в CLIST, поместите его перед любым непустым символом. Если пробел является единственным символом в CLIST, лучше использовать функцию COMPBL().


Отличное объяснение Proc FCMP.

Спасибо, Деб. Вы использовали PROC FCMP раньше?


Предположим, что ваша строка находится в переменной var1, а новая строка — в переменной var2.

Если ваша исходная строка не содержит пробелов, вы также можете сделать следующее:
var2=translate(compbl(translate(strip(var1)," ","_")),"_"," " );

Если ваша исходная строка содержит пробелы, вам придется заменить их чем-то необычным, а затем заменить обратно.
var2=translate(translate(compbl(translate(translate(strip(var1),"§"," ")," ","_")),"_"," ")," "," §");

Спасибо, Гвидо, это интересный подход.Действительно, ваш код будет работать, но только (как вы упомянули) «если ваша исходная строка не содержит пробелов», что бывает редко.
Замена пробелов некоторыми экзотическими символами также описана в образце кода SAS 39036: устранение повторяющихся символов в строке. Но я считаю, что это довольно опасно, поскольку эти «экзотические» символы могут быть законными символами в исходных данных. Вот почему я предпочел бы полагаться на более универсальный и надежный подход, представленный в этом сообщении блога.


Привет, Леонид, действительно хорошая работа, я пытался предложить более быструю функцию, но не смог.
Только один вопрос: является ли "endfunc" вариантом "endsub"?

Спасибо, Неро. Я также попробовал несколько разных версий и выбрал наиболее эффективную. Хотя хотелось бы более быстрой реализации. Однако я понимаю, что скорость выполнения зависит от распределения повторяющихся символов, а также от длины полос дублирования, поэтому универсальной «лучшей» реализации может и не быть, поскольку она зависит от данных.

Что касается "endfunc" и "endsub", я думаю, вы можете использовать их взаимозаменяемо, но я предпочитаю использовать "endfunc" для функций и "endsub" для подпрограмм.


Здравствуйте. Это потенциально очень полезно, и я голосую за добавление UNDUPC в качестве встроенной функции SAS.

Я поэкспериментировал с этим и, кажется, нашел небольшое изменение, которое экономит около 10 % времени обработки. То есть используйте TRIM(x) вместо x в вызове функции TRANWRD. Я получил улучшение от 9,3% до 9,9%, когда использовал его на шаге DATA _NULL_, чтобы изолировать его вклад от накладных расходов на запись нового набора данных. Я был бы рад отправить копию теста, но не вижу возможности прикрепить документ к этому комментарию.

Я полагаю, что при реализации в виде нативной функции она в любом случае будет более эффективной, чем пользовательская версия.

Спасибо, Ван, за голос, комментарий и предложение. Отличный улов, кажется логичным обрезать x при использовании его в функции tranwrd(). Интересно, что я подчеркнул важность обрезки в функции поиска, но пренебрег последовательностью использования ее и в tranwrd. Я проверил это на данных и сценарии использования, представленных в сообщении в блоге, и добился улучшения на 2-3% как в функции, так и в процедуре вызова. Я обновил код блога с предложенным вами изменением. Еще раз спасибо!


Привет Леонид, это действительно очень полезно. Спасибо!

Рад это слышать. Спасибо, Марина, за отзыв.


Отличная функция, я бы проголосовал за добавление функции SAS.

Отлично! Спасибо, Рафи.


Это здорово. Спасибо, что поделились!!

Добро пожаловать, Билл. И спасибо за ваш отзыв.


Согласен! Это было бы отличной функцией. Это похоже на обобщенный COMPBL(). Хорошая работа!

Спасибо, Стю, ты совершенно прав! 3:0.


Это здорово! Я считаю, что эта функция должна быть изначально реализована и включена в программное обеспечение SAS, подобно COMPBL().

Спасибо, Татьяна, за отзыв. Ваш голос учтен 🙂


Я использовал функцию COMPBL() в прошлом, и, возможно, мне понадобится аналогичная функция для чего-то другого, кроме пробелов.

Спасибо, Брайан, за отзыв.

Оставить ответ Отменить ответ

Этот сайт использует Akismet для уменьшения количества спама. Узнайте, как обрабатываются данные ваших комментариев.

Что касается удаления повторяющихся значений или строк, Microsoft Excel предлагает множество различных вариантов. Но когда дело доходит до удаления идентичного текста в данной ячейке, Excel… ничего не дает. Никаких инструментов, никаких функций, никаких формул, ничего. Помешает ли это нам достичь нашей цели? Ни в коем случае. Если в Excel нет нужной нам функции, давайте напишем свою :)

Как удалить повторяющиеся слова в ячейке Excel

Проблема: у вас есть одинаковые слова или текстовые строки в ячейке, и вы хотите удалить второй и все последующие повторы.

Удалить дубликаты в ячейке Excel

Решение: пользовательская функция или макрос VBA.

Определяемая пользователем функция для удаления дубликатов в ячейке

Чтобы удалить повторяющийся текст в ячейке, вы можете использовать следующую определяемую пользователем функцию (UDF) с именем RemoveDupeWords:

Как вставить код функции в книгу

Чтобы добавить приведенный выше код в Excel, вам нужно сделать следующее:

  1. Нажмите клавиши ALT + F11, чтобы открыть редактор Visual Basic.
  2. На левой панели щелкните правой кнопкой мыши Эта книга и выберите Вставить >Модуль.
  3. Вставьте приведенный выше код в окно Код.

Дополнительную информацию см. в разделе Как вставить код VBA в Excel.

Синтаксис функции RemoveDupeWords

Наша недавно созданная функция для удаления повторяющегося текста в ячейке имеет следующий синтаксис:

  • Текст (обязательно) — строка или ячейка, из которой вы хотите удалить повторяющийся текст.
  • Разделитель (необязательно) — разделитель, которым повторяющийся текст отделяется. Если он опущен, в качестве разделителя используется пробел.

Функция не чувствительна к регистру, то есть строчные и прописные буквы обрабатываются как одни и те же символы.

Как использовать функцию RemoveDupeWords

После добавления кода функции в книгу вы можете использовать его в формулах так же, как встроенные функции Excel.

Просто начните вводить название функции после знака равенства, и оно появится в формуле intellisense. Дважды щелкните функцию, и она будет вставлена ​​в ячейку. Определите аргументы, введите закрывающую скобку, нажмите Enter , и формула будет завершена.

Пользовательская функция для удалить дубликаты в ячейке». ширина=

Например, чтобы удалить повторяющиеся слова, разделенные запятой и пробелом, из A2, введите приведенную ниже формулу в B2, а затем перетащите ее вниз через столько ячеек, сколько необходимо:

В результате вы получите список уникальных слов или подстрок, разделенных запятой и пробелом:

Удаление повторяющихся слов, разделенных через запятую и пробел

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

Удаление повторяющихся слов, разделенных через запятую

Если ваши исходные данные разделены пробелом, второй аргумент должен быть " " или опущен:

Удаление дубликатов в разделенной ячейке по пробелам

Как и любая другая функция Excel, наша UDF автоматически пересчитывает данные при изменении исходных данных, поэтому ваши результаты всегда будут актуальными.

Макрос VBA для одновременного удаления повторяющегося текста из нескольких ячеек

Если вы хотите удалить повторяющийся текст из нескольких ячеек за один раз, вы можете вызвать функцию RemoveDupeWords из макроса. В этом случае разделитель жестко запрограммирован, и вам придется обновлять код макроса каждый раз при изменении разделителя. Кроме того, вы можете написать несколько вариантов кода для наиболее распространенных разделителей, скажем, пробела, запятой или запятой и пробела, и дать своим макросам осмысленные имена, например. Удалить DupesDelimSpace.

Код макроса выглядит следующим образом:

В приведенном выше коде разделителем является запятая и пробел. Чтобы использовать другой разделитель, замените "," другим символом(ами) в этой строке кода:

Примечание. Для работы макроса его код и код функции RemoveDupeWords должны находиться в одном модуле.

Как использовать макрос

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

Подробнее см. в разделе Как запустить макрос в Excel.

Примечание. Поскольку действие макроса нельзя отменить, мы настоятельно рекомендуем сохранить книгу непосредственно перед использованием макроса. Таким образом, если что-то пойдет не так, вы можете просто закрыть и снова открыть книгу, и вы вернетесь к тому же месту, где и были.Или вы можете просто сделать копию рабочего листа (листов), на который может повлиять макрос.

Как удалить повторяющиеся символы в ячейке

Проблема: у вас есть несколько вхождений одного и того же символа в ячейке, в то время как каждая ячейка должна содержать только одно вхождение данного символа.

Решение: пользовательская функция или макрос VBA.

Удаление повторяющихся символов в ячейке

Определяемая пользователем функция для удаления повторяющихся символов

Чтобы удалить повторяющиеся символы в ячейке, оставив только первые вхождения, можно использовать следующую определяемую пользователем функцию с именем RemoveDupeChars:

Чтобы вставить код функции в книгу, выполните те же шаги, что и в предыдущем примере.

Синтаксис функции RemoveDupeChars

Синтаксис этой пользовательской функции настолько прост, насколько это возможно — требуется только один аргумент:

Где текст — это строка или ячейка, из которой вы хотите удалить повторяющиеся символы.

Эта функция чувствительна к регистру и обрабатывает строчные и прописные буквы как разные символы.

Как использовать функцию RemoveDupeChars

Все, что мы сказали об использовании RemoveDupeWords, верно и для RemoveDupeChars. Итак, не вдаваясь в теорию, давайте сразу перейдем к примеру.

Чтобы удалить повторяющиеся символы из столбца A, начиная с A2, введите эту формулу в B2 и скопируйте ее вниз:

Как видно на изображении ниже, функция успешно обрабатывает различные типы символов, включая буквы, цифры и специальные символы:

Пользовательская функция для удалить повторяющиеся символы в ячейке

Совет. Если ваши символы отделены друг от друга каким-либо разделителем, например пробелом, запятой или дефисом, используйте функцию RemoveDupeWords, как показано в предыдущем примере.

Макрос VBA для удаления одинаковых символов из ячейки

Как и RemoveDupeWords, функцию RemoveDupeChars также можно вызывать из макроса:

Поскольку в этой пользовательской функции не используются разделители, вам не придется вносить какие-либо изменения в код.

Примечание. Для работы макроса его код и код UDF RemoveDupeChars должны быть размещены в одном модуле в редакторе VBA.

Как использовать макрос

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

  1. Выберите диапазон ячеек, из которых вы хотите удалить повторяющиеся символы.
  2. Нажмите клавиши ALT + F8, чтобы открыть диалоговое окно Макрос.
  3. В списке макросов выберите RemoveDupeChars2.
  4. Нажмите Выполнить.

Макрос для удаления повторяющиеся символы из каждой ячейки в выбранном диапазоне

Удаление повторяющихся подстрок с помощью Ultimate Suite

В начале этого руководства упоминалось, что Microsoft Excel не имеет встроенной функции удаления дубликатов в ячейке. Но наш Ultimate Suite делает это!

Его можно найти в раскрывающемся меню Удаление дубликатов на вкладке Данные Ablebits в группе Дедупликация. Если параметр «Удалить повторяющиеся подстроки» не отображается в Excel, убедитесь, что у вас установлена ​​последняя версия Ultimate Suite (бесплатную пробную версию можно скачать здесь).

Инструмент удаления повторяющихся подстрок для Excel

Чтобы удалить повторяющиеся слова или текст из нескольких ячеек за 5 секунд (по секунде на шаг :), вам нужно сделать следующее:

  1. Выберите исходные данные и запустите инструмент Удалить повторяющиеся подстроки.
  2. Укажите разделитель.
  3. Укажите, следует ли рассматривать последовательные разделители как один (по умолчанию).
  4. Выберите, следует ли выполнять поиск с учетом или без учета регистра.
  5. Нажмите "Удалить".

Готово! Не нужно возиться с VBA или формулами, только быстрые и точные результаты.

Удаление повторяющегося текста в Excel без VBA

Чтобы узнать больше об этой замечательной надстройке, посетите ее домашнюю страницу. Или, что еще лучше, загрузите ознакомительную версию ниже и попробуйте!

Вот как удалить повторяющийся текст в ячейке.Я благодарю вас за чтение и надеюсь увидеть вас в нашем блоге на следующей неделе!

Читайте также: