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

标签 perl csv

我有一个包含以下示例数据的 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/

相关文章:

python - Perl 相当于(Python-)列表理解

arrays - 在可变宽度列中打印数组内容

Powershell 查询 - 找不到路径的一部分

c# - 允许用户选择要导入的列标题

bash - 如何用十六进制数字对 CSV 文件进行排序?

perl - Moose::Role - 增加角色应用的简单方法?

perl - 由于相似的键而导致哈希值覆盖?

php - Apache、mod_*、PHP、Perl、Python、Ruby;向后学习

mysql - 在 MySQL 中上传 .csv 文件时出现未知列错误

php - 从 HTML 表单解析 CSV 并插入 MYSQL 数据库