如何使用Perl脚本从CSV文件中提取唯一字段

时间:2017-02-27 16:58:08

标签: perl csv

我有一个CSV文件,其数据与此类似:

#include <opencv2/opencv.hpp>
using namespace cv;

int main(int argc, char** argv)
{
    if(argc!=2){
      std::cerr << "ERROR: Please supply an image name" << std::endl;
      exit(1);
    }

    // Load up the image and check
    Mat image = imread(argv[1], IMREAD_GRAYSCALE);
    if(image.empty()){
      std::cerr << "ERROR: Unable to load image" << std::endl;
      exit(1);
    }

    // Calculate connected components
    Mat label;
    int n=connectedComponents(image,label,8,CV_16U);
    std::cout << "n=" << n << std::endl;
}

我能够使用以下代码使用数据成功创建两个新文件:

alpha,a,foo,bar
alpha,b,foo,bar
alpha,c,foo,bar
beta,d,foo,bar
beta,e,foo,bar   

基本上,此代码读取CSV文件中的行,并在基于第一个字段命名的文件中创建内容。所以,&#34; ziggy.alpha&#34;文件有九行内容,而&#34; ziggy.beta&#34;文件有六行内容。请注意,我正在通过&#34;而#34;正在读取行时将数据附加到这些文件中。循环。

我的挑战:

按照引用的数据集示例,我需要创建第二对使用相同&#34;第一个字段&#34;命名约定(例如&#34; zaggy.alpha&#34;和&#34; zaggy.beta&#34;)。这些文件只会在写入静态内容的情况下创建一次,并且不会从CSV文件中附加其他数据。

我的问题:

有没有办法在第一个字段中识别唯一值(&#34; alpha&#34;&#34; beta&#34;),将它们存储在哈希中,然后在&#34中引用它们;而&#34;循环以便在inputs.csv文件打开时创建我的第二组文件?

提前感谢您提供的任何见解!

2 个答案:

答案 0 :(得分:1)

在perl中,您可以从关联数组中获取键列表,如:

my @keys = keys %hash;

这样的事情会起作用;

my %unique_first_values;

然后在循环中。

$my_unique_first_values{$fields[0]} = 1;

然后,您可以在哈希上调用'keys'来获取唯一值。

@unique = keys %my_unique_virst_values;

答案 1 :(得分:0)

为了在input.csv文件打开时创建我的第二组文件&#34;你以前想知道你以前是否看过某个价值。

在Perl中执行此操作的传统方法是创建一个哈希来存储以前看到的值,然后检查然后设置以确定您是否已经看到它,记录它已被看到,以及继续。

if (exists($seen_before{$key})) {
    # seen it
} 
else {
    # new key!
    $seen_before{$key} = 1;
}

鉴于您打算打开文件并附加数据,在哈希中存储文件句柄而不是1可能是有意义的。这样,您的# new key!代码可能只是打开文件,而您的# seen it代码可能是默认条件(直通),将字段写出来。像这样:

unless (exists($file_handle{$key})) {
    $file_handle{$key} = open ... or die ...
}

# now we know it's in the hash, write the data:
print $file_handle{$key} ...