【发布时间】:2016-11-15 23:29:45
【问题描述】:
我有一个问题,我似乎找不到答案。
我有一个 CSV 文件,其中包含不同个人的绩效记录。假设每个人只有一条记录,但是,有些人有几条不同信息的记录。我想将第一个文件与另一个也有个人列表的文件进行比较,尽管我只想比较文件 1 中的个人是否在文件 2 中也有记录(文件 2 没有重复项)。个人 ID 是唯一的。
文件 1 的示例:
ID number A B C D
4011NM16001 apple 24 sunday 2016-01-01
4011NM16001 apple 16 wednesday 2016-01-01
4012NM15687 pear 16 sunday 2015-04-19
4012NM15002 banana 8 monday 2015-09-09
4012NM14301 peach 10 wednesday 2014-03-18
4012NM14301 peach 18 wednesday 2014-03-18
我已经打开了第一个文件,并尝试将数据放入散列(或者如果我正确理解这些概念,则更确切地说是散列和数组的组合),以便使用 ID 作为唯一键来删除重复项。但是,它并没有覆盖具有相同 ID 的条目,而是似乎仍然添加了它,所以我仍然以重复记录结束。
我想看看这个:
ID number
4011NM16001
4011NM15687
4012NM15002
4012NM14301
但我还是看到了这个:
ID number
4011NM16001
4011NM16001
4012NM15687
4012NM15002
4012NM14301
4012NM14301
是我在代码中输入了错误还是我没有正确使用哈希?我还是 Perl 的新手,所以我使用了以前程序的部分内容,并尝试边学边学..
#!/usr/bin/env perl
use DBI;
use strict;
use warnings;
my $file1 = 'location1.csv'; #file1 containing records with duplicates
my $exists = 'location3.csv'; #output file with unique IDs that will be compared to file2
open (EXISTS, ">$exists") or die "Cannot open $exists";
print EXISTS "ID number\n";
open (FILE1, "$file1") or die "Cannot open $file1";
while (<FILE1>){
my %file1;
my $line = $_;
$line =~ s/\s*$//g;
my ($ID, $a, $b, $c, $d) = split('\,', $line);
next if !$ID or substr($ID,0,2) eq 'ID';
$file1{$ID}[0]=$ID; #unique ID number
$file1{$ID}[1]=$a; #record a
$file1{$ID}[2]-$b; #record b
$file1{$ID}[3]=$c; #record c
$file1{$ID}[4]=$d; #record d
print EXISTS "$file1{$ID}[0]\n";
}
exit;
【问题讨论】:
-
我想你知道你不需要
use DBI吗?该模块从未使用过
标签: arrays perl hash duplicates key