我有两个文本文件,包含各种位置值的列数据,按位置排序.
- 100 1
- 101 1
- 102 0
- 103 2
- 104 1
- ...
以下是第二个文件(B)的示例:
- 20 0
- 21 0
- ...
- 100 2
- 101 1
- 192 3
- 193 1
- ...
而不是将两个文件中的一个读入哈希表,这是由于内存限制而禁止的,我想要做的是以逐步的方式同时遍历两个文件.
这意味着我想通过A或B的线流并比较位置值.
如果两个位置相等,则我对与该位置相关的值进行计算.
否则,如果位置不相等,我会移动文件A或文件B的行,直到位置相等(当我再次执行计算时)或我达到两个文件的EOF.
在Perl中有没有办法做到这一点?
解决方法
看起来像是一个可能偶然发现的问题,例如具有键和值的数据库表数据.这是rjp提供的伪代码的实现.
- #!/usr/bin/perl
- use strict;
- use warnings;
- sub read_file_line {
- my $fh = shift;
- if ($fh and my $line = <$fh>) {
- chomp $line;
- return [ split(/\t/,$line) ];
- }
- return;
- }
- sub compute {
- # do something with the 2 values
- }
- open(my $f1,"file1");
- open(my $f2,"file2");
- my $pair1 = read_file_line($f1);
- my $pair2 = read_file_line($f2);
- while ($pair1 and $pair2) {
- if ($pair1->[0] < $pair2->[0]) {
- $pair1 = read_file_line($f1);
- } elsif ($pair2->[0] < $pair1->[0]) {
- $pair2 = read_file_line($f2);
- } else {
- compute($pair1->[1],$pair2->[1]);
- $pair1 = read_file_line($f1);
- $pair2 = read_file_line($f2);
- }
- }
- close($f1);
- close($f2);
希望这可以帮助!