标题可能不那么具有描述性。让我来解释:具有从另一个文本文件中获取文本文件的索引
我有一个文件(文件说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次这样的例子,这是不能接受的我的用户
如何做到这一点,消耗少得多。时间,或通过任何其他概念。
我想主要优点是XS'sum'这应该是比手挽的foreach快,而'split'在这里不会被多次执行'@ indexes'元素。 – 2014-09-04 07:17:37
顺便说一句,“打开”里面的do块的目的是什么?限制$ fh范围,并自动关闭文件? – 2014-09-04 07:20:51
那,以及这个代码可读的事实? :) – Miller 2014-09-04 07:21:39