Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Парсер на Perl

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

lrase



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Имеется скрипт парсера  

Код:
sub parsecurcalls()
{
    while($str=<PBX_DATA>)
    {
        $stringnumber++;
        if($str =~ /^(\d{4})\/(\d{2})\/(\d{2})\s+(\d{2})\:(\d{2})\:(\d{2})\,(\d{2})\:(\d{2})\:(\d{2})\,(\d+)\,(\d*)\,(\w{1})\,([\w|\d|*|#]*)\,([\w|\d|*|#]*)\,([\w|\d]*)\,(\d+)\,(\d+)\,(\d+)\,([\w|\s|\d|.]+)\,([\w|\s|\d|.]+)\,([\w|\s|\d|.]+)\,([\w|\s|\d|.]+)\,(\d+)\,(\d+)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,([\w|\s|\d|.]*)\,([\w|\s|\d|.]*)\,(\d*)/)
        {
            print("$1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 $16 $17 $18 $19 $20 $21 $22 $23 $24 $25 $26 $27 $28 $29 $30 $31 $32 $33 $34 $35 $36 $37\n");
            unitecurcalls();
        }
        else
        {
            print("$stringnumber\n");
            if ($vars{debug} =~ /yes/i)
            {
                if ($str !~ /^$/)
                {
                    print $str;
                };
            };
        };
    };
};
 
sub unitecurcalls()
{
   my $calltype = $16;
   my $callers_number = $11;
   my $sent_number=$13;
   my $colinenum = 0;
 
        # 1.Запуск вызова YYYY-MM-DD HH:MM:SS
        $timeofcall = "$1-$2-$3 $4:$5:$6";
 
        # 3.Время звонка
        $duration = (($7 * 3600) + ($8 * 60) + $9);
 
        #11. Продолжительность.
   $forwarded = $18; # 1 Если для этого ID вызова существуют другие записи, 0 в ином случае
 
        # 9.Внутренний
        if ($calltype = 1) {
      return; # Внутренний вызов!
        }
 
        # Номер CO линии  
   if ($21=~(/T9(\d{3})/)) { # 14. Устройство абонента 2
      $colinenum=$1;
   }
 
        # 5.Направление
        if($12 =~ /O/) {
      $way=2; # outgoing
      $internally=$callers_number; # 4.Вызывающий абонент
      $number=$sent_number; #6. Набираемый номер, Исходящие вызовы: Набранные цифры.
      $co=$colinenum;
   } else {
      $way=1; # incoming
      $internally=$callers_number; # 4.Вызывающий абонент
      $number=$sent_number; #6. Набираемый номер, Входящие вызовы: Целевой добавочный номер для вызова.
      $co=$colinenum;
   }
 
        if ($timeofcall ne "")
        {
                $callsCount++;
        }
 
    print("$timeofcall , $forwarded , $internally , $co , $way , $number , $duration\n");
    WriteRecord($timeofcall, $forwarded, $internally, $co, $way, $number, $duration);
};
1;

Скрипт должен разобрать вот эти строчки из текстового файлика  

Код:
2014/08/07 18:46:54,00:00:00,0,7812740****,I,7812740****,7812740****,,0,1012990,0,T9200,Line 200.0,,,0,0,,,,,,,,,,,,,
2014/08/07 18:46:54,00:00:06,0,7812740****@ipoffice,I,#AA:Callcentr,7812740****,,0,1012991,0,T9018,Line 18.1,V9542,VM Channel 42,0,0,,,,,,,,,,,,,
2014/08/07 18:46:54,00:00:00,0,7812740****,I,7812740****,7812740****,,0,1012990,0,T9200,Line 200.0,,,0,0,,,,,,,,,,,,,
2014/08/07 18:46:54,00:00:06,0,7812740****@ipoffice,I,#AA:Callcentr,7812740****,,0,1012991,0,T9018,Line 18.1,V9542,VM Channel 42,0,0,,,,,,,,,,,,,

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

Всего записей: 21 | Зарегистр. 08-02-2007 | Отправлено: 22:11 14-08-2014 | Исправлено: lrase, 22:41 14-08-2014
fqs

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А в чем состоит вопрос?

Всего записей: 70 | Зарегистр. 21-06-2014 | Отправлено: 08:13 15-08-2014
lrase



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вопрос состоит в том.
Нужно правильно распарсить текст из файла. Насколько я понимаю ошибка где то в этой строчке.
     
Код:
 
$stringnumber++;  
   if($str =~ /^(\d{4})\/(\d{2})\/(\d{2})\s+(\d{2})\:(\d{2})\:(\d{2})\,(\d{2})\:(\d{2})\:(\d{2})\,(\d+)\,(\d*)\,(\w{1})\,([\w|\d|*|#]*)\,([\w|\d|*|#]*)\,([\w|\d]*)\,(\d+)\,(\d+)\,(\d+)\,([\w|\s|\d|.]+)\,([\w|\s|\d|.]+)\,([\w|\s|\d|.]+)\,([\w|\s|\d|.]+)\,(\d+)\,(\d+)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,([\w|\s|\d|.]*)\,([\w|\s|\d|.]*)\,(\d*)/)  
        {  

Всего записей: 21 | Зарегистр. 08-02-2007 | Отправлено: 11:38 15-08-2014 | Исправлено: lrase, 11:39 15-08-2014
fqs

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
ошибка где то в этой строчке

Эта строчка, а точнее то, что находится между символами / и / называется RegExp
 
Если его исправить вот так, то твоим строкам он вроде начинает соответствовать.
 

Код:
/^(\d{4})\/(\d{2})\/(\d{2})\s+(\d{2})\:(\d{2})\:(\d{2})\,(\d{2})\:(\d{2})\:(\d{2})\,(\d+)\,([\w\@]*)\,(\w)\,([\w\d\*\#\:]*)\,([\w\d\*\#]*)\,([\w\d]*)\,(\d+)\,(\d+)\,(\d+)\,([\w\s\d\.]+)\,([\w\s\d\.]+)\,([\w\s\d\.]*)\,([\w\s\d\.]*)\,(\d+)\,(\d+)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,([\w\s\d\.]*)\,([\w\s\d\.]*)\,(\d*)/

 

Всего записей: 70 | Зарегистр. 21-06-2014 | Отправлено: 12:27 15-08-2014 | Исправлено: fqs, 12:44 15-08-2014
lrase



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Спасибо, сейчас попробую.
 
 
Добавлено:

Цитата:
Если его исправить вот так, то твоим строкам он вроде начинает соответствовать.  
 
 
Код:
/^(\d{4})\/(\d{2})\/(\d{2})\s+(\d{2})\:(\d{2})\:(\d{2})\,(\d{2})\:(\d{2})\:(\d{2})\,(\d+)\,([\w\@]*)\,(\w)\,([\w\d\*\#\:]*)\,([\w\d\*\#]*)\,([\w\d]*)\,(\d+)\,(\d+)\,(\d+)\,([\w\s\d\.]+)\,([\w\s\d\.]+)\,([\w|\s|\d|.]*)\,([\w\s\d\.]*)\,(\d+)\,(\d+)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,(\d*)\,([\w|\s|\d|.]*)\,([\w|\s|\d|.]*)\,(\d*)/
 

 
Не помогло по прежнему ошибка
 

Код:
WARNING! No lines transferred to SQL from a log file. This is possibly caused by parsing error.
Executed with an error

Всего записей: 21 | Зарегистр. 08-02-2007 | Отправлено: 12:32 15-08-2014
fqs

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Тем не менее.
Твоим четырем строкам примера мой регексп соответствует (твой исходный - нет)
 
 
Добавлено:
Возможно проблема вообще не в приведенном фрагменте.
Во всяком случае он процитированный WARNING не выводит.
 
Если действительно "в перле полный ноль...", то думаю, бесполезно дальше в таком режиме чинить.

Всего записей: 70 | Зарегистр. 21-06-2014 | Отправлено: 12:47 15-08-2014
lrase



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Спасибо за попытку.

Всего записей: 21 | Зарегистр. 08-02-2007 | Отправлено: 12:59 15-08-2014
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Парсер на Perl


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru