从另一个文本文件中获取文本文件的索引

时间:2014-09-04 06:17:11

标签: arrays perl hash

标题可能不那么具有描述性。让我解释一下:

我有一个文件(说文件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).

我想要文件2,第1行的1 2 3 4 5(文件1第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 X 25000行文件2:时间 8分钟 我的数据可能超过此示例的4倍。这对我的用户来说是不可接受的。
如何实现这一目标,消耗的时间要少得多。或任何其他概念。

1 个答案:

答案 0 :(得分:2)

始终在每个PERL脚本中包含use strict;use warnings;

您可以通过多次处理第一个文件来简化脚本。而且,你的编码风格已经过时了。您可以使用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