繁体   English   中英

Perl - 从带有回车和换行的文件中解析多行数据

[英]Perl - Parse multi-line data from a file with carriage return and line feed

ParseLog.log:

Bug : 4525: TC1 

Scan Summary:   

Affected Snap:

Snap data - Important Snap data 5674 

Stack data - Important Stack data 5421  

Affected Stack:

TestStream1 - Important Stack 6322

No Longer Affected Snap:

None

-------------

open(my $parseLog, '<', 'parseLog.log')   or die "Can't open search file: $!";    
local $/ = "\r\n" ; 

while ( my $line = <$parseLog> )
{

$line =~ s/[\x0A\x0D]//g;

my @bugData = $line =~ /Bug :(.*?):/g;
my @snapData = $line =~ /\bAffected Snap:\b(.*?)\bAffected Stack:\b/sg; 

print Dumper @bugData ;
print Dumper(@snapshotData);

}

从 ParseLog.log,我想解析

  1. 错误数据(即,4525)
  2. Affected Snap: 和 Affected Stack 之间的多行数据:

ParseLog 文件有回车和换行。

我无法使用 chomp 删除它们,所以我使用了$line =~ s/[\\x0A\\x0D]//g;

在此 $line 变为

错误:4525:TC1Scan 摘要:------------受影响的快照:快照数据 - 重要的快照数据 5674 堆栈数据 - 重要的堆栈数据 5421 受影响的堆栈:TestStream1 - 重要的堆栈 6322 不再受影响的快照:无不再受影响的堆栈:无

我能够解析错误编号(错误:4525:TC1)

当我尝试解析“受影响的快照:”时,我得到以下信息

$VAR1 = ' 4525';
$VAR1 = 'Snap data - Important Snap data 5674 Stack data - Important Stack data 5421';

预期的:

$VAR1 = ' 4525';
$VAR1 = 'Snap data - Important Snap data 5674';
$VAR1 = 'Stack data - Important Stack data 5421';

背景:

受错误 4525 影响的文件是

“快照数据 - 重要快照数据 5674”和“堆栈数据 - 重要堆栈数据 5421”

\\R代表任何类型的换行符,您可以使用触发器运算符:

my @snapData;
while(<DATA>) {
    if (/^Affected Snap:/ .. /^Affected Stack:/) {
        s/\R+//;
        next if /^\s*$/;
        next if /^Affected /;
        push @snapData, $_;
    }
}
print Dumper\@snapData;



__DATA__
Affected Snap:

Snap data - Important Snap data  5674

Stack data - Important Stack data 5421


Affected Stack:

TestStream1 - Important Stack  6322

输出:

$VAR1 = [
          'Snap data - Important Snap data  5674',
          'Stack data - Important Stack data 5421'
        ];

你为什么不使用 chomp 命令?

代码

use strict;
use warnings;
use Data::Dumper;
my @snapData;
while (<DATA>) {
    if (/^Affected Snap:/ .. /^Affected Stack:/) {
        chomp;
        s/\s+$//;
        next if /^\s*$/;
        next if /^Affected /;
        push @snapData, $_;
    }
}

print Dumper\@snapData;

__DATA__
ParseLog.log:

Bug : 4525: TC1 

Scan Summary:   

Affected Snap:

Snap data - Important Snap data 5674 

Stack data - Important Stack data 5421  

Affected Stack:

TestStream1 - Important Stack 6322

No Longer Affected Snap:

None

编辑输出

$VAR1 = [
          'Snap data - Important Snap data 5674',
          'Stack data - Important Stack data 5421'
        ];

假设这是在 Unix/Linux 系统上..

速战速决,我使用了太多往往是cat与CR + LF文件到通过命令行的新文件,如下所示...

cat original.txt > fixed.txt

我并不是说这是解决此问题的最佳方法,但至少这样^M都会被 cat 忽略并且不会移动到 fixed.txt 文件中。

然后您需要做的就是根据需要解析fixed.txt。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM