在csv文件中查找doublet数据

时间:2015-10-23 11:48:42

标签: perl

我正在尝试编写一个Perl脚本,可以检查csv文件是否在最后两列中有双重数据。如果找到双重数据,则应添加带有“doublet”一词的附加列:

示例,原始文件如下所示:

cat,111,dog,555

cat,444,dog,222

mouse,333,dog,555

mouse,555,cat,555

最终输出文件应如下所示:

cat,111,dog,555,doublet

cat,444,dog,222

mouse,333,dog,555,doublet

mouse,555,cat,555

我是Perl脚本的新手,所以我不会暴露自己到目前为止所写的内容。我试图通读文件将数据拆分为两个数组,一个包含前两列,另一个包含最后两列

然后想法检查第二个数组中的doublets,并将带有“doublets”信息的附加列添加(推送?)到该数组,然后再将两个数组合并到一起(?)

不幸的是,我的大脑现在已经崩溃了,我需要一些比我更聪明的人的帮助,引导我朝着正确的方向前进。

非常感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:-1)

这不是最有效的方法,但这里可以帮助您入门。脚本假定您的输入数据以逗号分隔,并且可以包含任意数量的列。

#!/usr/bin/env perl
use strict;
use warnings;

my %h;
my @lines;
while (<>) {
  chomp;
  push (@lines,$_);   # save each line
  my @fields = split(/,/,$_);
  if(@fields > 1) {
    $h{join("",@fields[-2,-1])}++;   # keep track of how many times a doublet appears.
  }
}

# go back through the lines. If doublet appears 2 or more times, append ',doublet' to the output.
foreach (@lines) {
  my $d = "";  
  my @fields = split(/,/,$_);
  if (@fields > 1 && $h{join("",@fields[-2,-1])} >= 2) {
    $d = ",doublet";
  }
  print $_,$d,$/;
}

语法@fields[-2,-1]是一个数组切片,它返回一个包含最后两列值的数组。然后,join("",...)将它们连接在一起,这成为哈希的关键。 $/是输入记录分隔符,默认情况下是换行符,写入速度比"\n"

更快
cat,111,dog,555,doublet

cat,444,dog,222

mouse,333,dog,555,doublet

mouse,555,cat,555