如何在读取文件时格式化每一行?

时间:2014-10-30 22:24:03

标签: perl insert line

输入格式:

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。

有什么建议吗?

1 个答案:

答案 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";
}