Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Парсер на Perl

Автор: lrase
Дата сообщения: 14.08.2014 21:11
Имеется скрипт парсера

Код: 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;
Автор: fqs
Дата сообщения: 15.08.2014 07:13
А в чем состоит вопрос?
Автор: lrase
Дата сообщения: 15.08.2014 10:38
Вопрос состоит в том.
Нужно правильно распарсить текст из файла. Насколько я понимаю ошибка где то в этой строчке.

Код:
$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*)/)
{
Автор: fqs
Дата сообщения: 15.08.2014 11:27

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

Эта строчка, а точнее то, что находится между символами / и / называется 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*)/
Автор: lrase
Дата сообщения: 15.08.2014 11:32
Спасибо, сейчас попробую.


Добавлено:

Цитата:
Если его исправить вот так, то твоим строкам он вроде начинает соответствовать.
 

Код:
/^(\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
Автор: fqs
Дата сообщения: 15.08.2014 11:47
Тем не менее.
Твоим четырем строкам примера мой регексп соответствует (твой исходный - нет)


Добавлено:
Возможно проблема вообще не в приведенном фрагменте.
Во всяком случае он процитированный WARNING не выводит.

Если действительно "в перле полный ноль...", то думаю, бесполезно дальше в таком режиме чинить.
Автор: lrase
Дата сообщения: 15.08.2014 11:59
Спасибо за попытку.

Страницы: 1

Предыдущая тема: Delphi Single to Dword


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.