coruТаблицы и данные на практике

Excel не убирает пробелы: проверьте код символа

Два кода могут выглядеть одинаково, но содержать разные символы. СЖПРОБЕЛЫ обрабатывает обычный пробел, но не неразрывный U+00A0. Сначала определите символ, затем применяйте только допустимые для ваших ID замены.

Три примера AB 007 с выделенной позицией пробела: обычный U+0020 — 32, неразрывный U+00A0 — 160, узкий неразрывный U+202F — 8239.
Жёлтые отметки показывают позиции символов, а не реальную ширину знаков. СЖПРОБЕЛЫ сохраняет одиночный внутренний обычный пробел. Замена 160 и 8239 допустима только по правилам ваших ID. Иллюстрация: Coru. Оригинальная схема Coru.

Неудачный поиск — повод для проверки

Если поиск не находит код, который вроде бы есть в таблице, сравните сам текст. Обычный, неразрывный и узкий неразрывный пробел бывает трудно различить на экране. Разберём эту причину на пяти вымышленных вариантах AB 007.

В нашем примере один обычный пробел между AB и 007 значим. По условию лишние пробелы с краёв, повторные обычные пробелы и два указанных неразрывных пробела можно привести к единому виду. У настоящих ID правила могут быть другими: выясните их до изменения данных.

Соберите пять примеров

На пустом листе подпишите A1:D1: Код, Длина, Третий символ, Очищено. Вставьте следующие пять строк в A2:A6. Каждая начинается с = и создаёт текст; не вставляйте весь блок в одну ячейку. Цифры 007 останутся частью текста.

Формулы для A2:A6

text

="AB 007"
="AB  007"
="AB"&ЮНИСИМВ(160)&"007"
="AB"&ЮНИСИМВ(8239)&"007"
="  AB 007  "

Для русских имён функций. В строке 3 два обычных пробела внутри, в строке 6 — по два с каждого края.

Проверьте длину и подозрительную позицию

Введите =ДЛСТР(A2) в B2 и =UNICODE(ПСТР(A2;3;1)) в C2, затем протяните обе формулы до строки 6. Вторая показывает код Unicode третьего символа, а не всех пробелов в ячейке. Здесь разделитель стоит третьим в строках 2–5. В строке 6 из-за двух начальных пробелов третьей окажется буква A: результат 65. Для своего кода укажите позицию именно того символа, который вызывает подозрение.

Ожидаемые результаты

text

Строка   Длина   Третий символ
2        6       32
3        7       32
4        6       160
5        6       8239
6        10      65

32 — обычный пробел U+0020; 160 — неразрывный U+00A0; 8239 — узкий неразрывный U+202F. Одинаковая длина не доказывает равенство текста.

Почему одной СЖПРОБЕЛЫ недостаточно

СЖПРОБЕЛЫ удаляет обычные пробелы по краям и сжимает их повторения внутри текста до одного. Неразрывный пробел U+00A0 она не удаляет. Второй неразрывный символ из примера, U+202F, в нашем рецепте тоже заменяется явно.

Не удаляйте все пробелы только ради успешного поиска: AB007 и AB 007 могут обозначать разные ID. Формула подходит лишь тогда, когда по правилам ваших данных перечисленные варианты считаются одним кодом.

Очистите вспомогательный столбец

text

=СЖПРОБЕЛЫ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(A2;ЮНИСИМВ(160);" ");ЮНИСИМВ(8239);" "))

Введите в D2 и протяните до D6. Между кавычками в каждой замене стоит один обычный пробел. Во всех пяти строках должен получиться AB 007 длиной 6 символов.

Что делает формула

Внутренняя ПОДСТАВИТЬ заменяет все U+00A0 обычным пробелом. Внешняя делает то же для U+202F. Затем СЖПРОБЕЛЫ упорядочивает обычные пробелы. Исходный столбец A остаётся для сравнения.

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

Проверьте ключи до использования в поиске

  • Примените одну и ту же допустимую очистку во вспомогательных столбцах обеих таблиц. Если очистить только искомое значение, отличие на другой стороне может остаться.
  • Проверьте, у каких разных исходных значений получился одинаковый ключ. Отсортируйте всю таблицу по вспомогательному столбцу, сохранив соответствие полей в каждой строке, и изучите повторные ключи. Пять учебных примеров специально дают один ключ; в реальных записях это может скрыть конфликт.
  • Сохраняйте исходные ID и нули в начале. Не преобразуйте коды в числа ради устранения пробелов. Если нули исчезли при прежнем импорте, эта формула их не восстановит.
  • Используйте очищенный столбец для сопоставления после проверки правил равенства и дубликатов ключей. Если совпадения всё ещё нет, проверьте тип данных и другие позиции символов.

Если у вас английские имена функций

Соответствия: СЖПРОБЕЛЫ — TRIM, ПОДСТАВИТЬ — SUBSTITUTE, ЮНИСИМВ — UNICHAR, ДЛСТР — LEN, ПСТР — MID. UNICODE пишется одинаково. Для длины используйте =LEN(A2), для третьего символа — =UNICODE(MID(A2,3,1)). Ниже английская версия очистки. Разделители аргументов зависят от региональных настроек; здесь в английских формулах используются запятые, в русских — точки с запятой.

Та же очистка с английскими именами функций

text

=TRIM(SUBSTITUTE(SUBSTITUTE(A2,UNICHAR(160)," "),UNICHAR(8239)," "))

Используйте имена функций, которые принимает ваша версия Excel.

Выберите следующий шаг

Учитывайте код символа и указанное правило для ID. Ответы доступны ниже и без JavaScript.

В импортированном коде между AB и 007 стоит U+00A0. По правилам ваших данных этот разделитель равнозначен одному обычному пробелу. Что делать дальше?

Ответы и пояснения
  • Явно заменить U+00A0 и проверить очищенные ключи: Да. Замените известный символ обычным пробелом и проверьте, не появился ли один ключ у разных исходных значений.
  • Применить только СЖПРОБЕЛЫ: СЖПРОБЕЛЫ сама по себе не удаляет неразрывный пробел U+00A0.
  • Удалить все пробелы во всех кодах: Так исчезнет и значимый разделитель в AB 007. Нужен результат AB 007, а не AB007.

Источники и материалы

Помогите улучшить руководство