[РЕШЕНО] Извлечение телефонных номеров из таблицы с данными

Автор Alexcostariha, 25 июля 2019, 22:27

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

Alexcostariha

Добрый день!
У меня имеется таблица, которая содержит столбец с данными по клиентам: адрес, ФИО, номера телефонов и прочее,-всё в одной ячейке для каждого клиента.
Мне нужно извлечь номера телефонов, которых может быть один или два и привести их к одному стандарту +79876543210.
Иногда, но очень редко встречаются и имейлы-тоже неплохо бы, но главное телефоны.
В регулярных выражениях я не силён. Далее нужно будет перевести столбец с телефонами в прстой текстовый файл, но видимо это будет несложно.
Буду благодарен за помощь.
Файл с образцом данных прилагается.

bigor

Это разово, или постоянно надо будет делать?

Если разово, то что бы не мудрить с формулами 3 шага:
1. в соседнюю ячейку пишем =SUBSTITUTE(A1;" ";"") и протягиваем на всю таблицу
2. выделяем полученный столбец жмем Ctrl+H в строке найти [7|8][:digit:]{10}, в строке заменить ^&^
    ставим галки регулярные выражения, только текущее выделение. Выбираем искать в значениях
3. Данные разбить по столбцам, в качестве разделителя указываем ^
все.
Почему то + даже экранированный, приводит к тому что выбираются 9 цифр телефона вместо 10
поэтому затем или меняем первую 7 на 8 или добавляем к ней +, через поиск замену
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

rami

Для LibreOffice 6.2 (не раньше) можно использовать функцию REGEX:

mikekaganski

#3
Цитата: Bigor от 26 июля 2019, 10:16[7|8][:digit:]{10}
...
Почему то + даже экранированный, приводит к тому что выбираются 9 цифр телефона вместо 10
Это как? То есть какой конкретно регэксп так делает?

В приведённом регэкспе есть небольшая погрешность: [7|8] - это не "семь или восемь", а "любая из трёх букв: 7, |, 8". Потому что внутри квадратных скобок идёт перечисление символов, допустимых в этом месте, а не вариантов слов, разделённых | - такой синтаксис работает только вне квадратных скобок.

Поэтому, видимо, если была попытка сделать так: [\+7|8][:digit:]{10}, то это значило: "сначала одна из четырёх букв: +, или 7, или |, или 8, а затем 10 цифр". И в таком виде будет именно то, что описано: выбираться будет вариант "плюс и за ним 10 цифр".

А можно вот так: (\+7|8)\d{10} - и это позволит выбирать плюс правильно.

Вот ссылка на справочник по регуляркам в библиотеке, используемой в ЛО.
С уважением,
Михаил Каганский

bigor

 
Цитата: mikekaganski от 26 июля 2019, 10:39Поэтому, видимо, если была попытка сделать так: [\+7|8][:digit:]{10}
Да Вы правы, так пытался :roll:
Спасибо за разъяснение
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Alexcostariha

rami
Супер, всё получилось! На одном из трёх компьютеров оказался libreoffice  6.2.3.2
Только из-за русификации формула выглядит так(сама изменилась):
=РЕГВ(ЕСНД("+" & РЕГВ($A2;"[:digit:] ?[:digit:]{3} ?[:digit:]{3} ?[:digit:]{2} ?[:digit:]{2}"; ;1);"");" ";"";"g").

Нельзя ли изменить восьмёрку на "7", чтобы у всех номеров был формат "+7"?(см. вложенный файл).

bigor
Что-то не пошло. Для русификации использовал вашу формулу как:
=ПОДСТАВИТЬ(A2;" ";"")

В результате исполнения, как я понял вашего решения, вокруг номеров телефонов подставляется. "^".
Посмотрите скриншот. Также не вижу где выполнить : " Данные разбить по столбцам, в качестве разделителя указываем ^".

bigor

Для замены в строке поиска лучше использовать вариант предложенный mikekaganski  (\+7|8)\d{10}, затем выделяем получившийся после замены столбец жмем данные - Текст по столбцам и там указываем нужный разделитель в итоге у нас получится несколько столбцов с данными, в двух номера телефонов, остальные можно удалить
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

bigor

Если есть возможность использовать Regex, то
для первого номера =IFNA(REGEX(REGEX(SUBSTITUTE(A3;" ";"");"(\+7|8)[:digit:]{10}";;1);"^8";"+7";1);"")
для второго
=IFNA(REGEX(REGEX(SUBSTITUTE(A3;" ";"");"(\+7|8)[:digit:]{10}";;2);"^8";"+7";1);"")
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

mikekaganski

Слегка укороченные формулы:
для первого номера
=IFNA("+7"&REGEX(REGEX(A1;"(?<=\+7|\D8)(?:\s*\d){10}";;1);"\s";"";"g");"")
для второго
=IFNA("+7"&REGEX(REGEX(A1;"(?<=\+7|\D8)(?:\s*\d){10}";;2);"\s";"";"g");"")
С уважением,
Михаил Каганский

rami

Цитата: Alexcostariha от 26 июля 2019, 15:16Нельзя ли изменить восьмёрку на "7", чтобы у всех номеров был формат "+7"?(см. вложенный файл).

bigor
Что-то не пошло. Для русификации ...

С поправками в формулах меня опередили...

А на счёт "не пошло", потому, что у каждого из нас разные настройки офиса, я русские названия функций могу читать только по слогам и со словарём ... ;D , т.к. никогда ими не пользовался. Если вам нужно вставить формулу на английском языке, включите в настройках "Использовать английские имена функций", вставьте формулы и переключите обратно на русские названия, это очень быстро и просто.

Alexcostariha

#10
Bigor
у меня получился первый ваш способ-правда без "+7"!
Подсказка про "Данные→Текст по столбцам" очень помогла.




rami
Большое спасибо за подсказку с языками. Как много интересного можно узнать про электроные таблицы!!!
Напишу пожалуй шпаргалку:
Сервис→Параметры→LibreOfficeCalc→Формула→Использовать английские имена функций.

Пришлось использовать REGEX

По результатам применения функции REGEX.
Всё-таки не все ячейки срабатывали на формулу. Поэтому часть работы пришлось сделать вручную.
Чтобы в соседнем столбце подставлять данные  в простом виде и из них извлекать номера телефонов
можно было бы использовать функцию SUBSTITUTE, но я использовал привычное копировать и вставить
в ту же ячейку,  например:  в ячейке B2 пишем "=A2", затем Ctrl+C  и Ctrl+Shift+V (текст, числа, даты и время)
из B2 в B2. Затем оставляю номера телефонов, разношу их по разным ячейкам(если их более одного).
Примерно 30% работы было сделано вручную из порядка 800 ячеек.
Далее я использовал возможности команды "найти и заменить"(убрать пробелы, тире и заменить первую цифру 8 на 7(^8→7)
и форматирование ячеек(чтобы подставить "+" в начале чисел); сразу на весь столбец.

Cпасибо Bigor, rami и mikekaganski, за ваши ответы.
Регулярные выражения, хорошая штука. По вашим формулам я даже смог сделать формулу для третьего номера-это
получилось легко  ;)
Не так всё страшно  оказалось, как я думал. Ну и выводы конечно:
нужно, как минимум, заносить данные в ячйки, так, чтобы было потом легко извлекать номера телефонов.