2014-09-04 96 views
0

標題可能不那麼具有描述性。讓我來解釋:具有從另一個文本文件中獲取文本文件的索引

我有一個文件(文件說1)一些數字 [由空間分隔。看到這裏,

1 2 3 4 5 
1 2 8 4 5 6 7 
1 9 3 4 5 6 7 8 
..... n lines (length of each line varies). 

我還有一個文件(文件說2)有一些數字 [由標籤分隔。在這裏看到,

1 1 1 1 1 1 0 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 0 1 1 1 1 1 
1 1 1 1 1 1 0 1 1 1 1 1 
..... m lines (length of each line fixed). 

我想的1 2 3 4 5日(文件1行1)位置的文件2總和,線1
我想的總和1 2 3 4 5 6 7 th (文件1行2)位置文件2行1等。
我想文件的面向行總和2與位置在文件中的所有行1
它看起來像:

5 6 6 …n columns (File 1) 
1 8 3 
9 8 4 
… m rows (File 2)   

我這樣做是由下面的代碼:

open(FH1, "File1.txt"); 
@index = <FH1>; 
open(FH2, "File2.txt"); 
@matrix = <FH2>; 
open(OUTPUT, ">sum.txt"); 
foreach $xx (@matrix) { 
    @k1 = split(/\t/, "$xx"); 
    foreach $yy (@index) { 
     @k2 = split(/ /, "$yy"); 
     $ssum = 0; 
     foreach $zz (@k2) { 
      $zz1 = $zz - 1; 
      if ($k1[$zz1] == 1) { 
       $ssum++; 
      } 
     } 
     printf OUTPUT"$ssum\t"; 
     $ssum = 0; 
    } 
    print OUTPUT"\n"; 
} 
close FH1; 
close FH2; 
close OUTPUT; 

它除了對大型文件的時間要求非常高以外,它的工作方式非常好。 (例如1000線文件1×25000行文件2:時間8分鐘
我的數據可能會超過4次這樣的例子,這是不能接受的我的用戶
如何做到這一點,消耗少得多。時間,或通過任何其他概念。

回答

2

始終在每個Perl腳本use strict;use warnings;

您可以通過多次不處理的第一個文件簡化您的腳本。另外,你的編碼風格是非常過時你用智慧h通過色彩從Modern Perl Book得到一些教訓。

以下是簡化腳本以充分利用更多現代風格和技巧的腳本。請注意,它目前從腳本,而不是外部資源的內部加載文件數據:

use strict; 
use warnings; 
use autodie; 

use List::Util qw(sum); 

my @indexes = do { 
    #open my $fh, '<', "File1.txt"; 
    open my $fh, '<', \ "1 2 3 4 5\n1 2 8 4 5 6 7\n1 9 3 4 5 6 7 8\n"; 
    map { [map {$_ - 1} split ' '] } <$fh> 
}; 

#open my $infh, '<', "File2.txt"; 
my $infh = \*DATA; 

#open my $outfh, '>', "sum.txt"; 
my $outfh = \*STDOUT; 

while (<$infh>) { 
    my @vals = split ' '; 

    print $outfh join(' ', map {sum(@vals[@$_])} @indexes), "\n"; 
} 

__DATA__ 
1 1 1 1 1 1 0 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 0 1 1 1 1 1 
1 1 1 1 1 1 0 1 1 1 1 1 

輸出:

5 6 7 
5 7 8 
5 6 7 
5 6 7 
+0

我想主要優點是XS'sum'這應該是比手挽的foreach快,而'split'在這裏不會被多次執行'@ indexes'元素。 – 2014-09-04 07:17:37

+0

順便說一句,「打開」裏面的do塊的目的是什麼?限制$ fh範圍,並自動關閉文件? – 2014-09-04 07:20:51

+0

那,以及這個代碼可讀的事實? :) – Miller 2014-09-04 07:21:39

相關問題