Имя: Пароль:
IT
 
Библиотека парсинга телефонных номеров
1 ivanovpetr79
 
12.03.11
19:39
Задача:

имеется Excel таблица со столбцом "Номер телефона".
Данные туда вбивались вручную не по шаблону, причем с еще и несколько телефонных номеров и со символами-мусором.

Необходимо:
привести номера телефонов к единой форме (международный формат, внутренний формат), узнать тип телефона (Toll free, мобильный, стационарный), искать номера телефонов в строке (сейчас в режиме бетатестирования)

Решение:
Библиотека libphnenumber версии 3.0 (Java):
http://code.google.com/p/libphonenumber/

Демонстарция (используется немного старая версия):
http://libphonenumber.appspot.com/

К примеру
4 95/9 87- 8  90-7 -> 8 (495) 987-89-07 или +7 495 987-89-07 (городской стационарный телефон - FIXED_LINE)

8/9031605612 -> 8 (903) 160-56-12, мобильный номер (MOBILE)

Использование для собственных тестов:
нужен Netebeans/Groovy, подключаем библиотеку и тестим.

Код здесь:
http://pastebin.com/czBu7NHg

Результаты здесь
http://pastebin.com/1xnm5SAX

Кстати на infostart просили такую же фичу:

http://forum.infostart.ru/forum24/topic28859/message324653/#message324653

P.S. Хотелось бы такое же найти/прикрутить к MS Access
2 zak555
 
12.03.11
19:41
давай мне - ща сделаю
3 ivanovpetr79
 
12.03.11
22:02
(2) - что?
4 Лефмихалыч
 
12.03.11
22:06
(0) чо сказать-то хотел?
5 Лефмихалыч
 
12.03.11
22:10
А, я понял.
В общем, я труЪ.
Принадлежность к мобильным определяется по префиксу оператора.
Все возможные в России городские номера перечислены тут: http://www.rossvyaz.ru/activity/num_resurs/registerNum/

Я ТРУЪ и пишу регескпы сам на 1С
6 ivanovpetr79
 
12.03.11
22:17
(4) - вообще то я спросить хотел:

1) как прикручивается Java к VBA или 1С, в идеале конечно же БЕЗ Java рантайм (аля wiki:GNU_Compiler_for_Java)
2) если первое невозможно, то ищется анлоггичная ActiveX библиотека
3) узнать альтернативные мнения по сабжу

обратите внимание на тестовый пример:


мой телефон - 4 95/9 87- 8  90-7
сотовый: 8/9031605612, я сейчас в командировке
- Мой номер в Сан-Франциско 1(415)-42 577-58


он из этого текста извлекает номера телефонов и опрделяет их типы
7 ivanovpetr79
 
12.03.11
22:22
(5) - кстати это нужно сделать в указанной библиотеке

как я понял она универсальна для всех стран, но я там не нашел "определения города откуда звонили" и "оператора святи стового телефона"

и по идее это библиотека якобы используется самим гуглом.
8 Лефмихалыч
 
12.03.11
22:28
Во-первых, http://libphonenumber.appspot.com/ с грохотом обрушилась, когда я ей попытался скормить "4 95/9 87- 8  90-7"
Во-вторых, из этой каши

мой телефон - 4 95/9 87- 8  90-7
сотовый: 8/9031605612, я сейчас в командировке
- Мой номер в Сан-Франциско 1(415)-42 577-58

алгоритмически получить номера возможно только, если внутри номера могут быть только цифры, скобки, пробелы и тире. В противном случае определить, где закончился один номер и начался второй, не получится. А при выполнении этого условия регэкспы - вполне себе решение.
9 ivanovpetr79
 
12.03.11
22:33
(8) - там установлена старая версия

я об этом тоже писал :-)

Демонстрация (используется немного старая версия):

у меня на версии 3.0 (libphonenumber-3.0.jar - именно этот файл):

http://code.google.com/p/libphonenumber/downloads/list

все работает. Эта версия всего лишь 2 дня назад зарелизилась.
10 Лефмихалыч
 
12.03.11
22:39
(9) я ни хера не понимаю, что ты хочешь и как отвечать...
11 Зеленый Кот
 
12.03.11
22:48
ну и нафиг эта библиотека?

Я ТРУЪ и пишу регескпы сам на 1С
12 ivanovpetr79
 
12.03.11
22:51
(10) - то что я написал нужно тестировать у себя, а не на сайте appspot.

понятно?

а чего я хочу - я написал в (6).
13 ivanovpetr79
 
12.03.11
22:54
(11) - к сожалению не все так просто, когда начнешь писать и отлаживать эти регекспы.
14 Torquader
 
12.03.11
22:56
Так а в чём проблема - предполагается, что номер телефона - это набор цифр, разделённых пробелами, тире и слешами. Между двумя номерами телефона должны стоять запятые.
Просто в большинстве случаев в базу пишут, например
123-01-01/1234, что означает, например, Московский номер 1230101 и добавочный потом 1234.
Или 985-123-45-67, что означает, что это номер МТС.
Самое прикольное, 2330101/02 - что означает, что записано два телефона 2330101 и 2330102
И как какая-то библиотека поймёт, что записал пользователь ?
15 ivanovpetr79
 
13.03.11
00:15
123-01-01/1234 -> 495 123-01-01 x 1234 -> (495) 123-0101 ext. 1234 -> (495) 123-0101 доб. 1234

985-123-45-67 -> 8 (985) 123-45-67, сотовый
16 Иван Болван
 
13.03.11
01:17
удаление гланд чере ***

зачем он нужно, номера телефонов читают люди!
17 ivanovpetr79
 
13.03.11
01:43
(16) - так точно, но предположим:

1) сверху начальниками/сеньорами/... поступила команда - телефоны в базу вводить только по маске. А существующие записи этому требованию не удовлетворяют и/или они будут импортироваться из внешних источников

2) номера телефонов должны набираться компьютером
18 Иван Болван
 
13.03.11
01:47
посадить двуногого автомата, можна нескольких, выполнять эту задачу. И джава никакой не надо
19 ivanovpetr79
 
13.03.11
02:07
(18) - я напишу это гуглу. Библиотека же их.
20 ivanovpetr79
 
13.03.11
14:03
и еще:

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

а когда юзер щелкнет - полный номер телефона, удобный для набора из его страны

или службы аля Adwords принимают номера телефонов (для размещения рекламы в интернете) только соответствующие определенной маске

нужная библиотека, пригодится
21 Дикообразко
 
13.03.11
14:14
(17) это настолько древний баян, что в приличном обществе давно стыдно показывать
22 Лефмихалыч
 
13.03.11
14:35
(12) по порядку

1. без JRE - ни как, живи с этим
2. ищется обезьяна у себя в *опе, а грамотные люди говорят: "Я ищу аналогичную ActiveX". Аналогичная activeX есть - это VBscript.RegExp, только к ней надо ум приложить.
3. Сабж - противоестественная струйня. Это альтернативное мнение.

(17) если сверху придет разнарядка себя за куй укусить, ты тоже первым делом ломанешься активыксы для этого искать? Все, что введено хотя бы с малой толикой здравого смысла, преводится к каноническому виду нехитрым регэкспом. Все остальное пусть исправляют люди, по скольку результат автоматического исправления этой каши все равно человек должен будет проверить, потому как ты сам ни каких гарантий не дашь.
23 Дикообразко
 
13.03.11
14:37
(22) кхм... сразу видно нач. детского сада...
раз есть силы прописные истины объеснять
24 Лефмихалыч
 
13.03.11
14:38
(23) это называется аргументация. Кроме того, кому станет хуже, если ТС поймет прописные истины?
25 ivanovpetr79
 
13.03.11
15:29
Я ищу аналогичную ActiveX
Аналогичная activeX есть - это VBscript.RegExp

под аналогичной ActiveX библиотекой имеется ввиду те "просто регескпы", а библиотека с "примерно таким же функционалом"

ИМХО вы так и не посмотели исходный текст библиотеки в (0)

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

К сожалению с

только к ней надо ум приложит

не так все просто. Я тоже могу сказать - применяй регекспы - изобретай велосипеды.

преводится к каноническому виду нехитрым регэкспом

libphonenumber именно это и делает, только имеет и выведена в аутсорс

без JRE - ни как, живи с этим

вы не правы.  http://en.wikipedia.org/wiki/Pdftk , использующая http://en.wikipedia.org/wiki/IText откомпилирован с помощью http://en.wikipedia.org/wiki/GCJ в нативный код. Но это утилита командной строки.

P.S. Короче 1Сники против гугла
26 Rie
 
13.03.11
15:37
(25) Там же у тебя javascript версия есть. Что тебе мешает её юзать?
27 Torquader
 
13.03.11
16:38
И что мне с этой библиотеки, если она предполагает, что номер телефона вводится в определённом формате, а пользователи, которые вводят телефон в базу, не всегда знают правила написания телефонных номеров.
Особенно прикольно, когда приходит клиент из другого города - его спрашивают домашний телефон, а он отвечает, как привык 123456 - оператор, не задумываясь, вводит это в базу.
И в результате уже никто не поможет что-то исправить.

Помнится, когда ещё Windows не было и были всякие FoxPro и т.п., так там для ввода телефонного номера были специальные шаблоны, которые не позволяли ввести номер неправильно, если бы про них не забывали бы, то и библиотека не понадобилась.
28 Злопчинский
 
13.03.11
16:50
123-01-01/1234 -> 495 123-01-01 x 1234 -> (495) 123-0101 ext. 1234 -> (495) 123-0101 доб. 1234
.
не вижу никаких причин почему это не может быт трактовано как два городских телефона
123-01-01 и 123-12-34
29 Лефмихалыч
 
13.03.11
18:58
(25) ну, продолжай биться головой об стену тогда, раз у тебя всё уже есть