БлогNot. Оцениваем личное распределение абонентов по опсосам :)

Помощь дата->рейтинг Поиск Почта RSS канал Статистика nickolay.info Домой

Оцениваем личное распределение абонентов по опсосам :)

В предверии вступления в силу закона об отмене мобильного рабства, многие абоненты задумываются о смене оператора. Подумываю об этом и я, ведь на МТС держит только 11-летний номер. С другой стороны, поменять можно и "шило на мыло", ведь все отечественные опсосы примерно в одинаковой степени жуликоваты и склонны к спаму. Веским аргументом "за" или "против" смены оператора, пожалуй, может стать анализ своей абонентской базы - сколько людей из Ваших контактов на каком операторе "сидят". Ведь "внутрисеть" у всех бесплатна или очень дёшева.

Ясно, что считать вручную - долго и неудобно, проще быстро написать сервис на PHP. Мой "Андроид" умеет экспортировать контакты в текстовый файл формата .vcf, Ваш, надеюсь, тоже. Файл .vcf устроен довольно просто - по крайней мере, все записи о номерах телефонов располагаются в отдельных строках и начинаются одинаковыми префиксами:

TEL;HOME:+3833551010
TEL;CELL:+79139012345

Таким образом, для анализа файла .vcf мне хватило следующего небольшого "творения":

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
 <meta content="text/html; charset=UTF-8" http-equiv="content-type">
 <title>Телефоны</title>
</head>
<body>
<p><small>Вставьте содержимое файла .vcf в текстовое поле</small></p>
<?php 
 $data='';
 if (isset($_POST['data'])) $data = htmlspecialchars(trim($_POST['data']));
 if (!isset($_POST['submit'])) {
  echo '<form method="post" action="'.$_SERVER['PHP_SELF'].'">
   <textarea name="data" rows="25" cols="80">'.$data.'</textarea>
   <input type="submit" name="submit" value="OK"></form>'."\n";
 } 
 else {
  $k=0;
  $array = explode ("\n",$data);
  $regexp = array (
   'МТС'=>"/((\+7|7|8)(91\d|98\d)(\d{7}))|(213\-?(\d{4}))/i",
   'Билайн'=>"/(\+7|7|8)(90\d|96\d)(\d{7})/i",
   'Мегафон'=>"/(\+7|7|8)(92\d)(\d{7})/i",
   'TELE2'=>"/(\+7|7|8)(95\d)(\d{7})/i",
   'Utel'=>"/(\+7|7|8)(99\d)(\d{7})/i",
   'Город'=>"/((\+7|7|8)(383|495)(\d{7}))|((\d{3})\-(\d{4}))|(\:\d{5})/i"
  );
  $regcnt = array (
   'Неизвестно'=>0, 'МТС'=>0, 'Билайн'=>0, 'Мегафон'=>0, 'TELE2'=>0, 'Utel'=>0, 'Город'=>0 
  );
  $unknown = array ();
  foreach ($array as $d) {
   $p=stripos($d,"TEL;"); //Сокращаем анализ - телефоны могут быть только в строке, начинающейся с "TEL;"
   if ($p!==0) continue;
   $found=false;
   foreach ($regexp as $key=>$value) {
    $res=preg_match($value,$d);
    if ($res===false) die ("Regexp error: ".$value);
    elseif ($res!==0) { $regcnt[$key]++; $k++; $found=true; break; }
   }
   if (!$found) {
    $regcnt['Неизвестно']++;
    $unknown[]=$d.'<br>';
   }
  }
  echo '<p>';
  reset($regcnt);
  while (list($ckey, $cvalue) = each($regcnt)) echo $ckey.': '.$cvalue.'<br>';
  echo 'Всего опознано: '.$k.'</p>';
  echo '<p><form method="post" action="'.$_SERVER['PHP_SELF'].'">'.
//Раскомментарьте строку ниже, чтобы возвращать данные .vcf в форму ввода
//   '<input type="hidden" name="data" value="'.$data.'">'.
   '<input type="submit" name="return" value="Вернуться"></form></p>'."\n";
  if ($regcnt['Неизвестно']>0) {
   echo '<p>Нераспознанные номера:</p>';
   print_r ($unknown);
  }
 }  
?>
</body></html>

Возможно, логичнее было бы описать шаблоны номеров по каждому оператору в массивах, вложенных в основной массив $regexp (а не по одному регулярному выражению на оператора), но это может замедлить выполнение кода, а файлы .vcf довольно велики. По тем же соображениям скрипт не возвращает данные назад в поле ввода по нажатию кнопки "Вернуться" (см. закомментаренную строку внизу листинга).

В версии, существующей на момент написания заметки, скрипт считает принадлежность номеров так:

Ясно, что это не всё, но мне хватило для достижения небольшой погрешности. Что не удалось распознать - показывается списком на экране результатов.

Работа онлайн-скрипта может меняться и пополняться новыми данными, если мне это понадобится.

Вот мои результаты, как видно, смена МТС на другого жулика опсоса может оказаться пока и неактуальна (с рассмотренной точки зрения; есть и другие соображения, конечно).

мои контакты по опсосам
мои контакты по опсосам

 Скрипт в работе


теги: php личное форматы статистика сервис опсосы android

комментарии (0)

10.11.2013, 18:03; рейтинг: 8481

  в началопоиск по блогунаписать авторустатистика

Наверх Яндекс.Метрика
© PerS
вход