2015-05-14 53 views
0

我想找到的圖案Pattern String,一旦發現獲取文件的下一行,我需要模式的下一行,其中包含頁碼,我需要提取頁碼2以下示例文本文件Page: 2 of 5。這裏是我的嘗試:如何,如果在文件模式的匹配使用Perl腳本

my $filename="sample.txt"; 
$i=1; 
open(FILE, "<$filename") or die "File couldn't be matched $filename\n"; 
@array = <FILE>; 
foreach $line(@array){ 
chomp($line); 
if ($array[$i]=~/(\s+)Pattern String(\s+)/) { 
    if ($array[$i]=~/(\s+)Page:(\s+)(.*) of (.*)/) { 
     $page = $3; 
    } 
} 

這裏是我的示例文本文件:

        Pattern String 

MCN: 349450A0  NCP Account ID: 999 600-0089   Page: 2 of 5 
============================================================================= 
Customer Name: PCS HEALTH SYSTEMS 

Customer Number: 349450A0 
+0

哪裏'$ i'從何而來? – choroba

+0

$ i值爲1,對不起,我現在編輯了代碼。 – user3829086

+0

我是新來的Perl,所以,請誰能告訴我怎麼去和模式之後提取下一行的值.. – user3829086

回答

1

這個怎麼樣?那是你要的嗎?比賽結束後,如果下一行不爲空,則顯示該行。讓我知道如果爲你工作。

# Perl: 
my $filename="sample.txt"; 
my $match = undef; 
my $line = ""; 

open(my $fh, "<", $filename) or die "Failed to open file: $!"; 

foreach (<$fh>) { 
$line = $_; 
if ($line =~ /.*Pattern\sString.*/) { 
    $match = 1; 
    next; 
} 
if (($match == "1") && ($line !~ /^$/)){ 
    print $line; 
    $match = undef; 
} 
} 
+0

用這種方法符合你不必完全樣本文件加載到內存中,從而降低了內存佔用。 –

1

我認爲這將解決這個問題(我假設樣本文件將始終具有相同的格式)。我希望這會幫助你,請讓我知道它是否有效。

my $filename="sample.txt"; 
my $count = 0; 
my $tgline = 0; 

open(my $fh, "<", $filename) or die "Failed to open file: $!"; 
my @lines = <$fh>; 

foreach (@lines) { 
if ($_ =~ /.*Pattern\sString.*/) { 
    $tgline = $count + 2; 
    if ($lines[$tgline] =~ /.*Page\:\s(\d+)\sof\s(\d+)$/) { 
    print "Current page: " . $1 . "\n"; 
    print "Total page #: " . $2 . "\n"; 
    } 
} 
$count+=1; 
} 
+0

頁碼,由於它工作正常。 – user3829086

+0

如何在模式匹配之後動態獲取下一個可用行,而不會給出計數編號。 – user3829086

0

我不知道爲什麼你匹配Pattern String,如果你的目標是從Page: 2 of 5從輸入文件achieveing 2。這是一種方式來獲得這樣的:

use warnings; 
use strict; 

my $filename = "sample.txt"; 
open my $fh, "<","$filename" or die "Couldn't open $filename: $!"; 
while (my $line = <$fh>) 
{ 
    if($line =~ m/.*Page:\s(\d+)\sof\s(\d+)$/) 
    { 
     print "$1\n"; 
    } 
} 

sample.txt的:

        Pattern String 

MCN: 349450A0  NCP Account ID: 999 600-0089   Page: 2 of 5 
============================================================================= 
Customer Name: PCS HEALTH SYSTEMS 

Customer Number: 349450A0 

輸出:

2 
+0

感謝的解決方案,但我想的圖案除了上面的回答 – user3829086