2013-04-08 50 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