如何删除CSV文件中的重复项?

时间:2016-01-06 10:11:45

标签: csv duplicates

我有一个包含大量电影数据的大文件,包括每部电影的唯一ID。虽然每行上的每个ID都是唯一的,但有些行包含重复的电影数据。

例如:

INSERT

在这种情况下,我想完全删除ID,movie_title,year 1,toy story,1995 2,jumanji,1995 [...] 6676,toy story,1995 6677,jumanji,1995 6677,toy story,1995行。这不仅仅发生在一部电影中,所以我不能做一个简单的查找和替换。我尝试使用Sublime Text的6677,jumanji,1995功能,但它运行正常,但我最终丢失了数据的第一列(唯一ID)。

任何人都可以推荐一种更好的方法来摆脱这些重复的行吗?

1 个答案:

答案 0 :(得分:0)

以下perl脚本可以解决问题。实际上,所有出现的电影都会从条目列表中删除。不要忘记添加文件路径。执行' perl'从命令行(mac os附带perl):

use IO::File;

my (
      $curline
    , $fh_in
    , $fh_out
    , $dict
    , @fields
    , $key
    , $value
);

$fh_in  = new IO::File("<..."); # add input file name
$fh_out = new IO::File(">..."); # add output file name
while (<$fh_in>) {
    chomp;
    $curline = $_;
    @fields = split ( /,/, $curline );
    ($key, $value) = (join(',', @fields[1..$#fields]), $fields[0]);
    if (!exists($$dict{$key})) {
        $$dict{$key} = 1;
        $fh_out->print("$curline\n");
    }
}
$fh_out->close();
exit(0);

<强>解释

  • 代码逐行处理输入行
  • 它维护了所看到的电影标识符的哈希值。
  • 电影标识符定义为没有ID号的行内容和紧随其后的逗号。
  • 如果尚未看到电影标识符,则会打印一行。

<强>买者

  • 显然,此解决方案不能很好地防止拼写错误。
  • 通过规范化键可以添加一定程度的容错。示例(不区分大小写的匹配):

    my $key_norm; # move that out of the loop in production code
    $key_norm = lc($key);        
    if (!exists($$dict{$key_norm})) {
       $$dict{$key_norm} = 1;
       $fh_out->print("$curline\n");
    }
    
  • 在编写此代码时,优雅和表现都没有发言权; - )