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>=我希望解析这应该仍然是一种可能性.由于没有一个分隔符,您需要尝试以下几种方式:
首先,拆分' ',然后取前三个值:
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)