我是perl的新手。我无法对列的数据进行非规范化。如何对其进行非规范化。我有以下输入
FieldA,FieldB,FieldC
bc,A1,A
bc,A2,A
bc,Z,Z
bc1,A,A
bc1,Z1,Z
bc1,Z2,Z
bc2,A1,A
bc2,A2,A
bc2,Z1,Z
bc2,Z2,Z
所需输出如下
FieldA,FieldB,FieldC
bc,A1#A2,Z
bc1,A,Z1#Z2
bc2,A1#A2,Z1#Z2
我尝试使用推送功能,但它不起作用。请帮忙解决这个问题。
my @aArray;
my @zArray;
while(<FILE_HANDLER>){
chomp($_);
@arr = split(/,/$_);
$bc_name = $arr[0];
$end = $arr[1];
if($end eq $end_temp){
push @aArray, $end;
}else{
push @zArray,$end;
}
$end_temp = $end;
}
答案 0 :(得分:1)
在这种情况下使用哈希值,使用bc,bc1,bc2
值作为键并将值与现有哈希值连接。
use warnings;
use strict;
my %h;
scalar <DATA>; #removing first line
while (<DATA>)
{
chomp;
my ($l,$r) = split(",");
$h{$l} .= "$r ";
}
print "$_ $h{$_}\n" foreach (keys %h)
__DATA__
FieldA,FieldB
bc,A1
bc,A2
bc,Z
bc1,A
bc1,Z1
bc1,Z2
bc2,A1
bc2,A2
bc2,Z1
bc2,Z2
您的脚本中存在多个问题,
首先,您应该在每个程序中使用use warnings
和use strict
。
你错过了,
分裂功能的问题。而这种情况使用哈希,因为如果我们需要一个数组,我们需要做更多的逻辑。
如果您使用的是默认变量($_
),请使用以下代码,而不是您的
chomp($_);
您可以写为chomp;
@arr = split(/,/$_);
您可以写为@arr = split(/,/);