【发布时间】:2017-07-12 23:36:57
【问题描述】:
我有一个包含以下示例数据的 csv 文件。
o-option(alphabetical)
v-value(numerical)
number1,o1,v1,o2,v2,o3,v3,o4,v4,o5,v5,o6,v6
number2,o1,v11,o2,v22,o3,v33,o44,v44,o5,v55,o6,v66
and so on....
需要的输出。
NUM,o1,o2,o3,o4,o44,o5,o6
number1,v1,v2,v3,v4,,v5,v6
number2,v11,v22,v33,,v44,v55,v66
and so on...
在此数据中,文件中的所有选项都是相同的,即 o1、o2 等,但选项 4 的值正在变化,即 o4、o44 等。在 o4 字段中总共有大约 9 个不同的选项值。任何人都可以帮助我使用 perl 代码以获得所需的输出。
我已经编写了以下代码,但仍然没有得到所需的输出。
my @values;
my @options;
my %hash;
while (<STDIN>) {
chomp;
my ($srn,$o1,$v1,$o2,$v2,$o3,$v3,$o4,$v4,$o5,$v5,$o6,$v6) = split /[,\n]/, $_;
push @values, [$srn,$v1,$v2,$v3,$v4,$v5,$v6];
push @options, $o1,$o2,$o3,$o4,$o5,$o6;
}
#printing the header values
my @out = grep(!$hash{$_}++,@options);
print 'ID,', join(',', sort @out), "\n";
#printing the values.
for my $i ( 0 .. $#values) {
print @{$values[$i]}, "\n";
}
输出:
ID,o1,o2,o3,o4,o44,o5,o6
number1,v1,v2,v3,v4,v5,v6
number2,v1,v2,v3,v44,v5,v6
从上面的输出来看,当值 44 出现时,它位于 option4 之下,因此其他值向左移动。这些值未与选项映射。请提出建议。
【问题讨论】:
-
最好提供具体数据,而不仅仅是 o1,v1。输入实际的数字和内容。我无法通过此示例遵循您想要的内容。