2016-02-27 23 views
-1

我一直拉我的頭髮4天,現在我還沒有這個工作。我必須記錄文件,我是我想提取聲音來自日誌文件的數據並將每個範圍保存到單獨的文件中。我如何從日誌文件中提取響度數據並將每個範圍保存到單獨的文件中。從文件中提取數據,保存每個範圍到一個單獨的文件

#! /usr/bin/perl/ 
    use warnings; 
    use strict; 

    my $outdir = "/home/lord-ivan/Soures_Code/Perl/projects/EJ/Queue/"; 
    my $somefile = "/home/lord-ivan/Soures_Code/Perl/projects/Data/EJDATA.LOG"; 
    my $count = 0; 
    my $spew = 0; 
    my $out; 

    open (my $fh, "< $somefile") or die "Could not open file '$somefile' $!"; 
    print "$somefile open\n"; 

    while (<$fh>) { 
     if (/TRANSACTION STARTED/) { 
      open($out, '>', "${outdir}TRANSACTION$count.txt") or die $!; 
      $spew = 1; 
      $count++; 

     } 

     if ($spew) { 
      print $out $_; 
     } 

     if (/TRANSACTION END/) { 
      close($out); 
      $spew = 0; 
     } 
    } 

這是日誌文件看起來像

*TRANSACTION STARTED* 
[020t CARD INSERTED 
[020tCARD: *************5845 
DATE 01-02-16 TIME 05:45:52 
05:46:26 GENAC 1 : ARQC 
EXTERNAL AUTHENTICATE: NO ARPC 
05:46:30 GENAC 2 : AAC 
01 FEB 2016  05:47:41  10160021 

    WITHDRAW 
    FROM XXXXXXXX ? 
INVALID TRANSCATION ON TERMINAL. 
----------------------- 
[020t 05:47:05 CARD TAKEN 
[020t 05:47:07 TRANSACTION END 
[0r(1)2[000p[040qe1w3h162[020t*742*02/01/2016*05:47* 
    *TRANSACTION STARTED* 
[020t CARD INSERTED 
[020tCARD: *************2584 
DATE 01-02-16 TIME 05:47:27 
05:48:00 GENAC 1 : ARQC 
05:48:05 GENAC 2 : TC 
[020t 05:48:16 CARD TAKEN 
[020t 05:48:22 NOTES PRESENTED 0,0,2,0 
01 FEB 2016  05:48:52  10160021 

    WITHDRAW 
    FROM XXXXXXXX ? 
AMT GHC40.00 
[020t 05:48:31 TRANSACTION END 
[0r(1)2[000p[040qe1w3h162[020t*743*02/01/2016*05:57* 

所需的輸出應該是這樣的每個.txt文件

*TRANSACTION STARTED* 
    [020t CARD INSERTED 
    [020tCARD: *************2584 
    DATE 01-02-16 TIME 05:47:27 
    05:48:00 GENAC 1 : ARQC 
    05:48:05 GENAC 2 : TC 
    [020t 05:48:16 CARD TAKEN 
    [020t 05:48:22 NOTES PRESENTED 0,0,2,0 
    01 FEB 2016  05:48:52  10160021 

     WITHDRAW 
     FROM XXXXXXXX ? 
    AMT GHC40.00 
    [020t 05:48:31 TRANSACTION END 
+1

你忘了提問了。你的代碼是做什麼的? – toolic

+0

這看起來很奇怪。你之前有沒有問過類似的問題? – Sobrique

+0

@Sobrique是的,但沒有得到答案和我正在尋找的解決方案 –

回答

0

當我們看到開始標記時,我們設置了一個標記,當我們看到結束標記時關閉標記。如果該標誌已啓用,我們會打印行。您必須根據自己的情況調整路徑,但此代碼肯定會創建順序文件,每個事務一個。

use strict; 
use warnings; 

my $count = 0; 
my $spew = 0; 
my $out; 

while (<DATA>) { 
    if (/TRANSACTION STARTED/) { 
     open($out, '>', "TRANSACTION$count.txt") or die $!; 
     $spew = 1; 
     $count++; 
    } 

    if ($spew) { 
     print $out $_; 
    } 

    if (/TRANSACTION END/) { 
     close($out); 
     $spew = 0; 
    } 
} 

__DATA__ 
*TRANSACTION STARTED* 
[020t CARD INSERTED 
[020tCARD: *************5845 
DATE 01-02-16 TIME 05:45:52 
05:46:26 GENAC 1 : ARQC 
EXTERNAL AUTHENTICATE: NO ARPC 
05:46:30 GENAC 2 : AAC 
01 FEB 2016  05:47:41  10160021 

    WITHDRAW 
    FROM XXXXXXXX ? 
INVALID TRANSCATION ON TERMINAL. 
----------------------- 
[020t 05:47:05 CARD TAKEN 
[020t 05:47:07 TRANSACTION END 
[0r(1)2[000p[040qe1w3h162[020t*742*02/01/2016*05:47* 
    *TRANSACTION STARTED* 
[020t CARD INSERTED 
[020tCARD: *************2584 
DATE 01-02-16 TIME 05:47:27 
05:48:00 GENAC 1 : ARQC 
05:48:05 GENAC 2 : TC 
[020t 05:48:16 CARD TAKEN 
[020t 05:48:22 NOTES PRESENTED 0,0,2,0 
01 FEB 2016  05:48:52  10160021 

    WITHDRAW 
    FROM XXXXXXXX ? 
AMT GHC40.00 
[020t 05:48:31 TRANSACTION END 
[0r(1)2[000p[040qe1w3h162[020t*743*02/01/2016*05:57* 
+0

感謝您的循環,但它只複製日誌文件並將其過濾到.txt文件中。它不會「創建順序文件,每筆交易一個」。 –

+0

@ lord-ivan你甚至運行過代碼嗎? –

+0

是的,我did.i有我can.check從我的文章 –

-1

嘛,據我瞭解,你必須在遇到'TRANSACTION START'時打開文件,並在遇到'TRANSACTION END'時將其關閉。所以你應該重寫你的循環。類似的東西:

while (<$fh>) { 
    if (/TRANSACTION STARTED/) { 
     $outputfile= "${outdir}TRANSACTION$filenumber"; 
     open ($ofh, "> $outputfile") or die "Could not open file '$outfile' $!"; 
     print $ofh $_;  
    } elsif (/TRANSACTION END/) { 
     print $ofh $_;  
     close $ofh; 
     $filenumber++; 
    } else { 
     print $ofh $_;  
    } 
} 
+0

@ jpi它仍然不會從日誌文件中提取數據。我只收到一個空文件 –

相關問題