使用perl解析日志文件

Com*_* 10 1 perl pattern-matching

我有一个日志文件,其中一些条目如下所示:

YY/MM/DD HH:MM:SS:MMM <Some constant text> v1=XXX v2=YYY v3=ZZZ v4=AAA AND BBB v5=CCC
Run Code Online (Sandbox Code Playgroud)

我正试图将其变成CSV格式:

Date,Time,v1,v2,v3,v4,v5
YY/MM/DD,HH:MM:SS:MMM,XXX,YYY,ZZZ,AAA AND BBB,CCC
Run Code Online (Sandbox Code Playgroud)

我想在Perl中这样做 - 亲自说话,我可能在其他语言中做得更快,但我真的想扩大我的视野.

到目前为止,我可以阅读文件,只选择符合我标准的行,但我似乎无法完成下一阶段的工作.我需要拼接输入线,但到目前为止我还是无法解决如何做到这一点.我看s//m//,但他们真的不给我我想要的东西.如果有人可以告诉我如何做到这一点或给我指点,我会非常感激.

重点:

  • 该行第二部分的值始终采用相同的顺序,因此映射/重新组织不一定是个问题.
  • 一些字段有自由文本,没有引用:(但随着标签全部开始v<number>=我希望解析这应该仍然是一种可能性.

JSB*_*ոգչ 6

由于没有一个分隔符,您需要尝试以下几种方式:

首先,拆分' ',然后取前三个值:

my @array = split / /, $line;
my ($date, $time, $constant) = splice @array, 0, 3;
Run Code Online (Sandbox Code Playgroud)

再次将其余字段连接在一起,然后重新拆分v\d+=以获取值:

my $rest = join ' ', @array;

# $rest should now be "v1=XXX v2=YYY ..."
my @values = split /\s*v\d+=/, $rest;
shift @values; # since the first element in @values will be empty

print join ',', $date, $time, @values;
Run Code Online (Sandbox Code Playgroud)

编辑:这是另一种可能更容易遵循的方法,并且效率稍高.这利用了在日期/时间和值列表之间出现常量文本的事实.

# assume that CONSTANT is your constant text
my ($datetime, $valuelist) = split /\s*CONSTANT\s*/, $line;
my ($date, $time) = split / /, $datetime;
my @values = split /\s*v\d+=/, $valuelist;
shift @values;

print join ',', $date, $time, @values, "\n";
Run Code Online (Sandbox Code Playgroud)