如何存储'| '使用perl在散列中使用假定的假脱机文件

时间:2013-04-08 09:02:29

标签: perl hash

以下是我的文本文件的格式

3PTTN8KS4DE6CT67NJC0|8269076305|22-FEB-13|-79|352
3PTTN8KS4DE6CT67NJC0|8269076305|22-FEB-13|90.83|387
3PY9MEMG0187YWJMBYA1|1114216131|15-FEB-13|-79|352
3PY9MEMG0187YWJMBYA1|1114216131|15-FEB-13|82.95|387
3Q335ZZGMDHZH9GV7TC1|1884476900|20-FEB-13|-79|352
3Q335ZZGMDHZH9GV7TC1|1884476900|20-FEB-13|89.27|387
3QA1Y5QTETP9N984P6W0|685532706|19-FEB-13|-79|352
3QA1Y5QTETP9N984P6W0|685532706|19-FEB-13|90.83|387
3QB8WFBAM94R4WG1Z5R1|1250545621|15-FEB-13|-79|352
3QB8WFBAM94R4WG1Z5R1|1250545621|15-FEB-13|89.27|387

现在我想将所有这些值读入perl哈希。这个文件是一个巨大的文件,必须与另一个巨大的文件进行比较。为此我想将它存储在perl hash中并进行比较。

只需要有关如何使用perl哈希保存此数据的帮助。

1 个答案:

答案 0 :(得分:1)

我不清楚你需要拆分任何东西,你的问题是书面的。只需将该行直接放入哈希:

#!/usr/bin/env perl

# 
# Usage:  
#
# $ compareFiles.pl foo.txt bar.txt
#

use strict;
use warnings;

my $dataRef;

my $sourceFn = $ARGV[0];
open my $sourceFh, "< $sourceFn";
while (<$sourceFh>) {
    chomp;
    my $sourceKey = $_;
    $dataRef->{$sourceKey} = 1;
}
close $sourceFh;
...

现在您可以通过打开第二个文件流并检查密钥是否存在来比较它:

...
my $compareFn = $ARGV[1];
open my $compareFh, "< $compareFn";
while (<$compareFh>) {
    chomp;
    my $comparisonKey = $_;
    if (defined $dataRef->{$comparisonKey}) {
        print STDOUT "We found [ $comparisonKey ] in both files!\n";
    }
}
close $compareFh;

如果您需要调整密钥,以便比较某些值的子集,请使用split("|", $_)$sourceKey$comparisonKey拆分为一个索引的令牌列表,您可以从例如

构建自定义键
my $sourceFn = $ARGV[0];
open my $sourceFh, "< $sourceFn";
while (<$sourceFh>) {
    chomp;
    my @sourceElements = split("|", $_);
    my $sourceKey = join("_", ($sourceElements[1], $sourceElements[3], $sourceElements[4]));
    $dataRef->{$sourceKey} = 1;
}
close $sourceFh;
...    

等。

确保使用与构造所有源键相同的过程构造比较键。

此外,您希望将密钥设计得足够独特,以便它可以作为两个或多个输入之间的可靠比较标记。

你基本上需要问问自己,你需要在输入之间进行比较。这个问题并不清楚,因为那里有很多冗余信息使得哈希表有点棘手。