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

时间:2015-09-08 09:09:31

标签: regex perl

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. 受影响的快照:和受影响的堆栈之间的多行数据:
  3. ParseLog文件具有回车符和换行符。

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

    此$行变为

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

    我能够解析Bug编号(Bug: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”

3 个答案:

答案 0 :(得分:3)

\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'
        ];

答案 1 :(得分:0)

为什么不使用chomp命令?

<强> CODE

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'
        ];

答案 2 :(得分:-1)

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

我经常使用的

快速修复是通过命令行将带有CR + LF的文件<!-- Used by Spring to pick up annotations --> <integration:annotation-config/> <context:component-scan base-package="myproject"/> <bean id="myDAOBean" class="org.gosh.financeimport.dao.MyDAOImpl" > <constructor-arg name="dataSource" ref="reDataSource"/> <constructor-arg name="sql" value="dbo.MySP" /> </bean> <!-- properties stored in a separate file --> <bean id="myDataSource" class="com.microsoft.sqlserver.jdbc.SQLServerDataSource"> <property name="databaseName" value="${myDataSource.dbname}" /> <property name="serverName" value="${myDataSource.svrname}" /> <!-- also loaded portNumber, user, password, selectMethod --> </bean> 放到一个新文件中,如下所示...

cat

我并不是说这是解决此问题的最佳方法,但至少这样cat original.txt > fixed.txt 全部被cat忽略,而不会移到fixed.txt文件中。

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