我有一个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文件打开时创建我的第二组文件?
提前感谢您提供的任何见解!
答案 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} ...