2014-09-04 63 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

相关问题