我在将两个数据集之间的值耦合在一起时遇到了麻烦,我想知道是否有人可以帮助我。我认为我已经接近解决方案,因此希望有人可以指出可能出了什么问题。
所以我有两种类型的数据集。一个看起来像这样,我们称之为数据集1:
1 Asia
2 Australia
3 Europe
dataset1包含我的参考集,其中每个数字都链接到一个值。 另一个数据集dataset2看起来像这样:
4638 3
14372 3
4464 1
3498 2
我想做的是使用数据集2中第二列的值,并在数据集1上找到关联的索引值,以便添加这样的新列:
4638 3 Europe
14372 3 Europe
4464 1 Asia
3498 2 Australia
我试图做的是在第一个数据集中创建值的哈希,并使用它们作为第二个数据库的引用,如下所示:
open($fh, "<", $dataset1) || die "Could not open file $dataset $!/n";
while (<$fh>) {
@tmp = split /\t/, $_;
$area{$tmp[0]} = $tmp[1];
}
open($fh2, "<", $dataset2) || die "Could not open file $dataset $!/n;
while (<$fh2>) {
@tmp2 = split /\t/, $_;
$code = $tmp2[0];
$index= $tmp2[1];
if(defined($area{$index})){
print "$code\t$index\t$area{$index}\n";
}
}
当我执行以上命令时,我没有收到警告,但没有打印出任何内容。我认为“已定义”部分存在问题,但不确定如何解决。任何帮助将不胜感激 。
最好, 答:
答案 0 :(得分:3)
来吧。我使用了一个哈希引用,因为我喜欢它们,我认为您在\ t上的划分是导致无法正确映射的主要问题。
EDIT: added chomp and ability to deal with space separated language names
#!/usr/bin/env perl
use strict;
use warnings;
my $ds1_map;
open(my $fh1, "<", 'dataset1') || die "Could not open file dataset1 $!/n";
while (my $line = <$fh1> ) {
chomp($line);
my @tmp = split(/\s+/, $line);
my $i = shift @tmp;
my $str = join(' ', @tmp);
$ds1_map->{$i} = $str;
}
close $fh1;
open(my $fh2, "<", 'dataset2') || die "Could not open file dataset2 $!/n";
while (my $line = <$fh2>) {
chomp($line);
my ($code, $index) = split(/\s+/, $line);
if(defined($ds1_map->{$index})){
print "$code\t$index\t$ds1_map->{$index}\n";
}
}
close $fh2;
答案 1 :(得分:1)
这是一种方法,它采用通过split
-引用数据文件中的每一行并将其元素map
-它们放入一组哈希键/值而创建的匿名数组。< / p>
注意:我已经使用IO::All
来缩短脚本,以这种方式处理非常大的文件可能不是很有效。
use IO::All ;
my @idx = io->file("dataset1.txt")->chomp->slurp ;
my @data = io->file("dataset2.txt")->chomp->slurp ;
# make an index hash_ref with successive elements of split lines
my $index_hr = { map { [split]->[0] => [split]->[1] } @idx };
# print lines where the second element matches index hashref key
foreach my $line (@data) {
my $key = (split /\s+/, $line)[1] ;
print join " ", $line, $index_hr->{$key}, "\n" ;
}
输出
4638 3 Europe
14372 3 Europe
4464 1 Asia
3498 2 Australia