Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Perl脚本从CSV文件中提取唯一字段_Perl_Csv - Fatal编程技术网

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

如何使用Perl脚本从CSV文件中提取唯一字段,perl,csv,Perl,Csv,我有一个CSV文件,其中的数据类似于: alpha,a,foo,bar alpha,b,foo,bar alpha,c,foo,bar beta,d,foo,bar beta,e,foo,bar 我能够使用以下代码使用数据成功创建两个新文件: open (my $FH, '<', '/home/<username>/inputs.csv') || die "ERROR Cannot read file\n"; while (my $line = <$FH>)

我有一个CSV文件,其中的数据类似于:

alpha,a,foo,bar
alpha,b,foo,bar
alpha,c,foo,bar
beta,d,foo,bar
beta,e,foo,bar   
我能够使用以下代码使用数据成功创建两个新文件:

open (my $FH, '<', '/home/<username>/inputs.csv') || die "ERROR Cannot read file\n";
while (my $line = <$FH>) {
    chomp $line;

    my @fields = split "," , $line;
    my $file = "ziggy.$fields[0]";
    open (my $FH2, '>>', $file) || die "ERROR Cannot open file\n";
    print $FH2 "$fields[1]\n";
    print $FH2 "$fields[2]\n";
    print $FH2 "$fields[3]\n\n";
    close $FH2;
}
open(my$FH,'>',$file)| | die“错误无法打开文件\n”;
打印$FH2“$fields[1]\n”;
打印$FH2“$fields[2]\n”;
打印$FH2“$fields[3]\n\n”;
收盘价$FH2;
}
基本上,此代码读取CSV文件中的行,并在基于第一个字段命名的文件中创建内容。因此,“ziggy.alpha”文件有九行内容,而“ziggy.beta”文件有六行内容。请注意,在通过“while”循环读取行时,我将数据附加到这些文件中

我的挑战:

根据引用的数据集示例,我需要创建第二对文件,它们使用相同的“第一个字段”命名约定(类似于“zaggy.alpha”和“zaggy.beta”)。这些文件将只创建一次,静态内容将写入其中,并且不会从CSV文件中附加额外的数据

我的问题:

是否有方法识别第一个字段(“alpha”和“beta”)中的唯一值,将它们存储在散列中,然后在“while”循环中引用它们,以便在inputs.csv文件打开时创建第二组文件


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

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

my @keys = keys %hash;
所以像这样的东西会起作用

my %unique_first_values;
然后在后面的循环中

$my_unique_first_values{$fields[0]} = 1;
然后可以调用散列上的“键”以获得唯一值

@unique = keys %my_unique_virst_values;
为了“在inputs.csv文件打开时创建我的第二组文件”,您需要知道以前是否看到过值

在Perl中执行此操作的传统方法是创建一个散列来存储以前看到的值,然后检查并设置,以确定您是否看到了它,记录是否看到了它,然后继续

if (exists($seen_before{$key})) {
    # seen it
} 
else {
    # new key!
    $seen_before{$key} = 1;
}
考虑到您将要打开文件并追加数据,在散列中存储文件句柄而不是
1
可能是有意义的。这样,您的
#新钥匙代码可能只是打开文件,而您的
#看到它
代码可能是写入字段的默认条件(失败)。大概是这样的:

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} ...

我看不出你的“挑战”与你的程序已经做的有什么不同。你所说的“静态内容”是什么意思?如果文件没有从CSV文件中附加数据,那么它从何而来?我使用了这种方法的一种变体来实现我的目标…谢谢你的帮助!