perl - 维护哈希值的哈希值中的顺序,并输出为 .csv

标签 perl csv hash

这是我的代码:

my %hash = (
    '2564' => {
                'st_responsible' => 'mname1',
                'critical' => '',
                'last_modified_by' => 'teamname1',
                'transstatus' => '',
                'rt_res' => 'pname1'
                },
    '2487' => {
                'st_responsible' => 'mname2',
                'critical' => '',
                'last_modified_by' => 'teamname2',
                'transstatus' => '',
                'rt_res' => ''
                }
);

print "xnum,st_responsible,critical,last_modified_by,transstatus,rt_res\n";
foreach my $x_number (sort keys %hash)
{
    print "$x_number";
    foreach my $element (keys %{$hash{$x_number}})
    {
        print ",$hash{$x_number}{$element}";
    }
    print "\n";
}

预期输出

xnum,st_responsible,critical,last_modified_by,transstatus,rt_res
2487,mname2,,teamname2,,
2564,mname1,,teamname1,,pname1

实际输出

xnum,st_responsible,critical,last_modified_by,transstatus,rt_res
2487,mname2,,,teamname2,
2564,mname1,,,teamname1,pname1

请帮助我了解如何准确保留此数据结构的顺序,然后将其写入 CSV 文件。

最佳答案

我建议为此,您最好使用 slice 来执行此操作。 ,这是一种按特定顺序从哈希中提取值列表的方法?

#configure field order
my @order = qw ( st_responsible critical last_modified_by transstatus rt_res );

#print header row 
print join (",", "xnum", @order ),"\n"; 
#iterate the rows
foreach my $key ( sort keys %hash ) { 
   #extract hash slice and join it with commas
   print join ( ",", $key, @{$hash{$key}}{@order} ),"\n";
} 

这给出:

xnum,st_responsible,critical,last_modified_by,transstatus,rt_res
2487,mname2,,teamname2,,
2564,mname1,,teamname1,,pname1

您可以考虑 Text::CSV - 但我建议在这种情况下它有点矫枉过正,最好在您需要担心引号和带引号的字段分隔符时使用。 (而你没有)。

如果您不仅需要处理空键,还需要处理丢失的键,您可以使用 map:

my @order = qw ( st_responsible critical last_modified_by 
                 transstatus missing rt_res extra_field_here );
print join (",", "xnum", @order ),"\n"; 
foreach my $key ( sort keys %hash ) { 
   print join ( ",", $key, map { $_ // '' } @{$hash{$key}}{@order} ),"\n";
} 

(否则您将收到有关 undef 值的警告)。

关于perl - 维护哈希值的哈希值中的顺序,并输出为 .csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35078803/

相关文章:

perl - 如何在 lib Path 中使用变量?

python - 在 Python 中拆分 Dataframe 列

php - 从 PHP 将上传的 CSV 导入 MySQL 表时更正 LINES TERMINATED BY

c - Perl:阻塞信号没有延迟 -> 提供了测试代码

regex - 删除 Perl 中两个引号之间的文本?

apache - URL 中的哈希字符(在 Apache 中访问和重定向)

c - atol 对不同的字符串产生相同的结果

PHP - 上传文件的哈希内容

perl - 如何在Perl中执行小数运算?

MySQL - 从 csv 文件导入 88000 行仅插入 39 行