Замена пробелов и новых строк на один разделитель

Автор NicholasLibre, 13 ноября 2022, 15:59

0 Пользователи и 1 гость просматривают эту тему.

NicholasLibre

Доброго времени дорогие друзья !
Есть таблицы, где в ячейках вставлены данные (номера телефонов). Между номерами телефонов разные разделяющие символы - несколько пробелов (вплоть до 27 я насчитал), символ переноса строки. Необходимо привести это к единому виду - так, чтобы между телефонами был только один разделяющий символ, к примеру,  вместо "+7 (964) 298-99-86                       +7 818 266-85-78" должно получиться "+7 (964) 298-99-86; +7 818 266-85-78". Всё это делается для загрузки в систему телефонии, чтобы система корректно распознала каждый телефон в ячейке. Сам я пытался придумать какой-то вариант с регулярными выражениями, записью макросов и т.д. Конечного решения не найдено. :roll:

economist

Загрузка в Астериск итп ведется и без разделителей, 10-значными числами: 9642989986

Принятие этого факта упрощает очистку, просто берем 10 цифр справа.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

bigor

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

mikekaganski

С уважением,
Михаил Каганский

NicholasLibre

Спасибо получилось ! А можете подробно объяснить, смысл формулы.
Я пока ждал ответа вроде тоже нашёл вариант \s{2,50} находит символ пробела, который входит в строку не менее 2 и не более 50 раз, заменяем на ";". Затем находим \n и заменяем на ";".

mikekaganski

#5
Цитата: NicholasLibre от 14 ноября 2022, 02:18А можете подробно объяснить, смысл формулы.

Предположу, что вопрос о формуле
Цитата: mikekaganski от 13 ноября 2022, 19:58=REGEX(A2;"\s+\+";";+";"g")
  • Используется функция REGEX с четырьмя аргументами - производится замена, флаг "g" (global) означает замену всех найденных вхождений, а не одного (по умолчанию первого).
  • A2 - относительная ссылка; это значит, что в ячейке B2 эта формула будет ссылаться на ячейку "в той же строке, в соседней ячейке слева", и при копировании ячейки вниз соответственно будут использоваться ячейки слева в соответствующих строках.
  • Регулярное выражение "\s+\+" состоит из двух элементов: "\s+" и "\+". Первый - это метасимвол \s, соответствующий любому пробельному символу, включая пробелы, табуляцию, переносы строк и т.п.; плюс после него означает, что будут найдены любые последовательности из идущих подряд пробельных символов длиной один и больше. Второй - это просто символ "плюс"; поскольку в регулярных выражениях плюс имеет специальное значение (пример которого мы только что разобрали в первом элементе), для того чтобы найти знак "плюс" в тексте, нужно экранировать плюс в регулярном выражении с помощью предшествующего обратного слэша. Регулярное выражение соответствует любым пробелам любой длины, после которых идёт плюс (из "+7"). Таким образом исключаются одиночные пробелы внутри номера, поскольку после них нет плюса, и нет необходимости как-то отдельно обрабатывать перенос строк (а заодно правильно обрабатываются номера, разделённые одним пробелом, которые не обработаются формулами из #2 и #4). Предположительно перед первым номером нет пробелов; если же это предположение неверно, и если разделитель перед первым номером недопустим, то в регулярное выражение нужно будет добавить look-behind assertion для того, чтобы пробелы с плюсом обрабатывались только после цифр. Также регулярка зависит от использования плюса в качестве первого символа номера телефона; если это не так, то придётся дорабатывать.
  • Замена идёт на точку с запятой, после которой идёт плюс (чтобы не потерять плюс, "выделенный" при поиске).
С уважением,
Михаил Каганский

bigor

При условии, что все номера начинаются на +, я не знаю ТС или кто-то другой вчера поднял похожий вопрос про номера в телеграмм канале, там часть была начинающихся на 8
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

mikekaganski

#7
Цитата: bigor от 14 ноября 2022, 09:01там часть была начинающихся на 8

Регулярные выражения так названы потому, что определяют правила, по которым идёт поиск соответствия. Это мощный язык, но полностью зависит от качества правила (его соответствия исходным данным). Как видно, в номерах встречаются добавочные номера, то  есть просто "N цифр подряд" не сработает; неизвестно, все ли номера начинаются с "+7" или "8", после которых идёт нечисловой символ (пробел или дефис или скобка), и могут ли быть одиночные восьмёрки (с обеих сторон ограниченные нечисловыми символами) не в начале номера...

Каков вопрос - таков ответ.
С уважением,
Михаил Каганский