代码之家  ›  专栏  ›  技术社区  ›  user2256825

如何使用perl将'|'提交的后台处理文件存储在hash中

  •  0
  • user2256825  · 技术社区  · 13 年前

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

    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散列中并进行比较。

    只需要关于如何使用perl散列保存这些数据的帮助。

    1 回复  |  直到 13 年前
        1
  •  1
  •   Alex Reynolds    13 年前

    我不清楚你是否需要分开任何东西,把你的问题写下来。只需将行直接放入散列中:

    #!/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;
    ...    
    

    请确保使用与构造所有源密钥相同的过程来构造比较密钥。

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

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