Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

14 Декабрь 2019, 16:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Доступно и просто о работе в офисных пакетах
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Извлечение телефонных номеров из таблицы с данными  (Прочитано 990 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Alexcostariha
Форумчанин
***
Offline Offline

Сообщений: 62



« Стартовое сообщение: 25 Июль 2019, 22:27 »

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

* phone_numbers-1.ods (23.37 Кб - загружено 14 раз.)
« Последнее редактирование: 27 Июль 2019, 12:00 от Alexcostariha » Записан
Bigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 775


« Ответ #1: 26 Июль 2019, 10:16 »

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

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

Пол: Мужской
Сообщений: 2 839


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #2: 26 Июль 2019, 10:39 »

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

* phone_numbers2.ods (24.41 Кб - загружено 13 раз.)
Записан

mikekaganski
Мастер
*****
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 1 628


« Ответ #3: 26 Июль 2019, 10:39 »

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

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

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

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

Вот ссылка на справочник по регуляркам в библиотеке, используемой в ЛО.
« Последнее редактирование: 26 Июль 2019, 10:41 от mikekaganski » Записан

С уважением,
Михаил Каганский
Bigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 775


« Ответ #4: 26 Июль 2019, 11:12 »

 
Поэтому, видимо, если была попытка сделать так: [\+7|8][:digit:]{10}
Да Вы правы, так пытался Да уж...
Спасибо за разъяснение
Записан
Alexcostariha
Форумчанин
***
Offline Offline

Сообщений: 62



« Ответ #5: 26 Июль 2019, 15:16 »

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

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

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

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


* izvl_tel_nom_vosemi.png (64.28 Кб, 661x367 - просмотрено 18 раз.)

* izvl_tel_nom_bigor.png (164.55 Кб, 1145x735 - просмотрено 21 раз.)
Записан
Bigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 775


« Ответ #6: 26 Июль 2019, 15:28 »

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

Пол: Мужской
Сообщений: 775


« Ответ #7: 26 Июль 2019, 16:09 »

Если есть возможность использовать 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);"")
Записан
mikekaganski
Мастер
*****
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 1 628


« Ответ #8: 26 Июль 2019, 17:49 »

Слегка укороченные формулы:
для первого номера
Код:
=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
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 839


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #9: 26 Июль 2019, 18:16 »

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

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

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

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

Alexcostariha
Форумчанин
***
Offline Offline

Сообщений: 62



« Ответ #10: 27 Июль 2019, 08:45 »

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, за ваши ответы.
Регулярные выражения, хорошая штука. По вашим формулам я даже смог сделать формулу для третьего номера-это
получилось легко  Подмигивающий
 Не так всё страшно  оказалось, как я думал. Ну и выводы конечно:
нужно, как минимум, заносить данные в ячйки, так, чтобы было потом легко извлекать номера телефонов.
« Последнее редактирование: 27 Июль 2019, 12:31 от Alexcostariha » Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!