【发布时间】:2013-11-06 00:24:26
【问题描述】:
如果我尝试读取多个大文件并使用密钥连接它们,我应该采取什么方法。可能有 1 到多个组合,因此一次读取一行适用于我的简单场景。寻求一些指导。谢谢!
use strict;
use warnings;
open my $head, $ARGV[0] or die "Can't open $ARGV[0] for reading: $!";
open my $addr, $ARGV[1] or die "Can't open $ARGV[1] for reading: $!";
open my $phone, $ARGV[2] or die "Can't open $ARGV[2] for reading: $!";
#open my $final, $ARGV[3] or die "Can't open $ARGV[3] for reading: $!";
while( my $line1 = <$head> and my $line2 = <$addr> and my $line3 = <$phone>)
{
#split files to fields
my @headValues = split('\|', $line1);
my @addrValues = split('\|', $line2);
my @phoneValues = split('\|', $line3);
# if the key matches, join them
if($headValues[0]==$addrValues[0] and $headValues[0]==$phoneValues[0])
{
print "$headValues[0]|$headValues[1]|$headValues[2]|$addrValues[1]|$addrValues[2]|$phoneValues[1]";
}
}
close $head;
【问题讨论】:
-
多大是多大?每个文件有多少字节,多少行?哪些文件(如果有)可以有多行具有相同的键值?
-
友情提示:
use autodie;,然后你就不必做open or die的事情了。 -
数百万行和高达 16GB 的文件。 head.txt 是独一无二的。除了 head.txt 之外的所有文件都可以有多行具有相同的键。
-
关于文件内容的更多信息可能会有用
-
(1) 文件是否在第一列排序或聚集? (2) 行的顺序重要吗?或者可以重新排序某些行? (3) 头文件与其他文件相比有多大? (4) 这段代码多久运行一次?一次,还是每天/每周? (5) 是否有特定的硬件限制,例如内存小,硬盘? (6) 如果您可以将您的意图表达为 SQL 查询,这可能会有所帮助。
标签: perl