如何存储一个' | '使用 perl 在哈希中分隔假脱机文件
Posted
技术标签:
【中文标题】如何存储一个\' | \'使用 perl 在哈希中分隔假脱机文件【英文标题】:How to store a' | 'delimeted spooled file in hash using perl如何存储一个' | '使用 perl 在哈希中分隔假脱机文件 【发布时间】:2013-04-08 09:02:28 【问题描述】:以下是我的文本文件的格式
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 哈希保存此数据的帮助。
【问题讨论】:
使用 csv 文件解析器?例如,Text::CSV
可以。也许一个数组可能比哈希更适合我。
数据的哪一部分应该是key?
定义巨大的? 100MB? 1 Gb? 100 Gb?
【参考方案1】:
我不清楚您是否需要拆分任何内容,并写下您的问题。直接把行放到hash里面:
#!/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)三arg-open
更好。用它。 (2) 错误处理是必须的。去做吧。 (3) 如果你测试一个哈希条目exists
,做that,而不是问它是否是defined
。 (4) split
的第一个参数是一个正则表达式,而不是一个字符串!您的模式 /|/
会在任何地方匹配。 (5) join
ing 使用不同的分隔符可能是一个错误。 (6) 切片很酷。以上是关于如何存储一个' | '使用 perl 在哈希中分隔假脱机文件的主要内容,如果未能解决你的问题,请参考以下文章