others - Perl用多行正则表达式读取大文件

53 3

用多行正则表达式读取大文件的最佳方法是什么?

下面是我的代码


package main;


use strict;


use warnings;



our $VERSION = 1.01;


my $buffer;


my $INFILE;


my $OUTFILE;



open $INFILE, '<', ... or die"Bad Input File: $!";


open $OUTFILE, '>',... or die"Bad Output File: $!";



while ( read $INFILE, $buffer, 512 ) {


 if ($buffer =~ /(?m)(^[^rn]*R+){1}^(B|BREAK|C|CLOSE|D|DO(?! NOT)|E|ELSE|F|FOR|G|GOTO|H|HALT|HANG|I|IF|J|JOB|K|KILL|L|LOCK|M|MERGE|N|O|OPEN|Q|QUIT|R|READ|S|SET|TC|TRE|TRO|TS|U|USE|V|VIEW|W|WRITE|X|XECUTE)( |:).*[^rn]/) {


 print $OUTFILE $&;


 print $OUTFILE"n";


 }


}



close( $INFILE ); 


close( $OUTFILE );


1;



以下是一些例子数据:


^%Z("EUD")


S %L=%LO,%N="E1"


^%Z("RT")


This is data that I don't want the regex to find


^%Z("EXY")


X ^%Z("EW2"),^%Z("ELONG"):$L(%L)>245 S %N="E1" Q:$L(%L)>255 X ^%ZOSF("EON") S DX=0,DY=%EY,X=%RM+1 X ^%ZOSF("RM"),XY K %EX,%EY,%E1,%E2,DX,DY,%N Q


^%Z("F12")


S %A=$P(^DIC(9.8,0),"^",3)+1,%C=$P(^(0),"^",4)+1 X"F %=0:0 Q:'$D(^DIC(9.8,%A,0)) S %A=%A+1" S $P(^DIC(9.8,0),"^",3,4)=%A_"^"_%C,^DIC(9.8,%A,0)=%X_"^R",^DIC(9.8,"B",%X,%A)=""


^%Z("F2")


S %=$H>21549+$H-.1,%Y=%365.25+141,%=%#365.251,%D=%+306#(%Y#4=0+365)#153#61#31+1,%M=%-%D29+1,%DT=%Y_"00"+%M_"00"+%D,%D=%M_"/"_%D_"/"_$E(%Y,2,3)



上面的行是成对的,语法上是(1号线和2号线一起走,3号线和4号线等等),在上面的数据中,我需要找到特定的对,其中的所有对都是:


^%Z("RT")


This is data that I don't want the regex to find



时间: 原作者:

126 0

如何解析一个非常大的文件,其中要处理的单元分布在未知的行数上。

例如,将一行附加到变量,并且检查(如果使用正则表达式,则尝试匹配)。继续,一旦它匹配进程并清除变量。


my $unit;


while (<$fh>) {


 # chomp; # if suitable, and then add a space


 # $unit .= ' '.$_; # as a separator that newline was


 $unit .= $_;



 if ( test_unit($unit) ) {


 # process ...


 $unit = undef;


 }


}



test_unit()子项是代码的占位符,它将决定是否应处理组装好的单元。如果是正规表达式就可以在循环前定义 my $re = qr/.../;if ($unit =~ $re)

原作者:
...