gpt4 book ai didi

perl - 如何使用 Perl 修改 CSV 文件中的字段?

转载 作者:行者123 更新时间:2023-12-04 07:01:20 25 4
gpt4 key购买 nike

我有一个包含以下示例数据的 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 之下,因此其他值向左移动。值未与选项映射。请建议。

最佳答案

如果要根据前面的选项值的值在列中排列数值,请将数据行存储为散列,使用选项作为散列的键。

use strict;
use warnings;

my (@data, %all_opts);

while (<DATA>) {
chomp;
my %h = ('NUM', split /,/, $_);
push @data, \%h;
@all_opts{keys %h} = 1;
}

my @header = sort keys %all_opts;
print join(",", @header), "\n";

for my $d (@data){
my @vals = map { defined $d->{$_} ? $d->{$_} : '' } @header;
print join(",", @vals), "\n";
}


__DATA__
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

关于perl - 如何使用 Perl 修改 CSV 文件中的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1789227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com