如何使用Perl脚本从CSV文件中提取唯一字段
我有一个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>)
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文件中附加数据,那么它从何而来?我使用了这种方法的一种变体来实现我的目标…谢谢你的帮助!