2013-04-08 101 views
0

下面是我的文本文件具有如何存储'|使用哈希“delimeted假脱机文件的perl

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 hash保存这些数据的帮助。

+2

使用csv文件解析器?例如'Text :: CSV'。也许一个数组可能比我更适合哈希。 – Christoph 2013-04-08 09:15:55

+5

数据的哪一部分应该是关键? – choroba 2013-04-08 09:19:41

+1

定义巨大? 100 Mb? 1 Gb? 100 Gb? – TLP 2013-04-08 09:49:22

回答

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; 
...  

等等

务必建立基于您用于构建所有信号源键相同的过程比较关键。

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

你基本上需要问自己,你需要什么来比较输入。这个问题并不清楚,因为存在大量冗余信息,这使得使用哈希表有点棘手。

+1

我冒昧地修理了一些东西:(1)三arg“开放”更好。用它。 (2)错误处理是必须的。做到这一点。 (3)如果你测试一个哈希条目是否存在,那么*不要问它是否是'defined'。 (4)“split”的第一个参数是一个正则表达式,而不是一个字符串!你的模式'/ | /'可以在任何地方匹配。 (5)'用不同的分隔符连接可能是一个错误。 (6)切片很酷。 – amon 2013-04-08 10:30:49