输入格式:
2014-09-21 00:09:22,718 TRACE [user: admin12] common.Log (PerformanceExtractor.Python:9776) - ClientId:895,UserId:258,Ip:111.1.1.1,DurationMls:23,DurationString:0.023 seconds,Url:Calculate.LoanExmple
我的输出是变量;例如:
$date = 2014-09-21 00:09:22,718 $user = admin12 $ClientId= 895 $UserID=258 $ip = 111.1.1.1 $time=0.023 $url=Calculate.LoanExmple
在JAVA中,我会使用循环,流对象和正则表达式来解决这个问题。我不知道如何使用Perl解决这个问题。我还将此变量作为列插入到数据库中,每次启动.pl时,该行至少为3000最大值5000。
我的循环是
{
print $line;
--formatting here?
last if $. == 500;
}
这只是打印出上面的行 - 我想最好的解决方案是格式化它并在读取每一行时将值转换为变量,准备用DBI库插入DB。
有什么建议吗?
答案 0 :(得分:0)
这样的东西?
while (<$fh>) {
my @fields = m{^
(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:[\d,]+)
\s TRACE \s
\[user:\s(\w+)]
\s common.Log \s \(PerformanceExtractor\.Python\:\d+\) \s - \s
ClientId:(\d+),
UserId:(\d+),
Ip:([\d.]+),
DurationMls:\d+,
DurationString:([\d.]+) \s seconds,
Url:(\S+)
$}x
or next; # skip lines which don't match regexp
printf('$date=%s; $user=%s; $client_id=%s; $user_id=%s; $ip=%s; $time=%s; $url=%s', @fields);
print "\n";
}