【问题标题】:How to send hash of hash of array items to csv如何将数组项的哈希值发送到csv
【发布时间】:2016-01-10 01:28:04
【问题描述】:

哈希值的哈希值正确打印到 csv,但数组值哈希值的哈希值弄乱了我的 csv 文件。请在下面找到我的代码不起作用。

<    use strict;
     use warnings;
     use Data::Dumper;

     my %student_hash;
     my $student_report = "StudentReport.csv";

     %student_hash = (
            'RollNummber1' => {
                               'studentname' => 'Boris',
                               'address' => ['Vietnam',
                                             'local'
                                            ],
                               'DOB' => '5june2000'

                               },
            'RollNummber2' => {
                               'studentname' => 'John',
                               'address' => [ 
                                             '4th/floor',
                                             'Culverdown/Street',
                                             'WestHam',
                                             'UK.',
                                            ],
                               'DOB' => '2feb2000'

                               },
            'RollNummber3' => {
                               'studentname' => 'Karen',
                               'DOB' => '5march2000'

                              }
           );

          print "StudentHash:".Dumper(\%student_hash);

          open(my $fh, '>', $student_report) or die("Couldn't open ile");
          print $fh "DOB \t,ADDRESS \t,NAME \t\n";

          foreach my $key(keys %student_hash){
           foreach my $secondkeys (keys %{$student_hash{$key}}){

             if($secondkeys =~ /DOB || studentname/) {
               print $fh "$student_hash{$key}{$secondkeys} \t,"; } 
             if($secondkeys =~ /address/) {
               print $fh Dumper $student_hash{$key}{$secondkeys} }; 
        }
    print $fh "\n";
 }
 close($fh);>

如果我注释掉打印数组部分,那么代码可以正常工作。有人可以建议如何在一个单元格或多个单元格中将数组元素打印到 csv 中。谢谢

【问题讨论】:

    标签: arrays windows perl csv hash


    【解决方案1】:

    使用Text::CSV - 如果您有要打印的数组引用,您可以使用print。 (它为您处理报价)。

    或者您可以使用column_names 设置列顺序,并使用print_hr 以该顺序输出哈希引用。

    看起来你并不担心RollNumber,所以你可以作弊:

    foreach my $student ( values %student_hash ) { 
    
    }
    

    迭代。我不清楚你想用address 做什么。但是一个简单的join 可能就可以解决问题。 (在换行或空格上,取决于所需的输出)。

    #!/usr/bin/env perl
    use strict;
    use warnings;
    use Text::CSV;
    
    my %student_hash = (
        'RollNummber1' => {
            'studentname' => 'Boris',
            'address'     => [ 'Vietnam', 'local' ],
            'DOB'         => '5june2000'
    
        },
        'RollNummber2' => {
            'studentname' => 'John',
            'address' => [ '4th/floor', 'Culverdown/Street', 'WestHam', 'UK.', ],
            'DOB'     => '2feb2000'
    
        },
        'RollNummber3' => {
            'studentname' => 'Karen',
            'DOB'         => '5march2000'
    
        }
    );
    
    my $csv = Text::CSV->new( { sep_char => ',', eol => "\n" } );
    $csv->column_names( 'studentname', 'DOB', 'address' );
    foreach my $student ( values %student_hash ) {
        if ( defined $student -> {address} ) { 
            $student -> {address} = join (" ", @{$student->{address}});
        }
    
        $csv->print_hr( \*STDOUT, $student );
    }
    

    【讨论】:

    • 不幸的是我不能使用模块。但我会试试这个加入技巧。我会让你知道谢谢
    • 这确实是“处理” CSV 数据的最简单方法。当然,给定一个多行地址,首先这不一定是正确的方法。你考虑过 XML 输出吗?
    • 实际上,一旦我能够在 csv 中打印多行地址,我想执行排序,以便顺序是学生姓名,然后是 DOB,然后是地址。我正在努力打印这个多行地址,我必须在不使用模块的情况下这样做。我将按照建议尝试在 XML 中打印。谢谢
    • 嗨,我尝试将其输出到 xml,并且我能够管理排序顺序,但我正在努力解决同样的问题,将数组打印到 csv :(
    • 加入为我工作。但它不会在一个单元格中打印整个内容,而是打印到下一个单元格。谢谢
    猜你喜欢
    • 2016-05-16
    • 1970-01-01
    • 2012-04-20
    • 2017-11-30
    • 1970-01-01
    • 2016-10-17
    • 2020-06-08
    • 2018-01-28
    • 2016-02-24
    相关资源
    最近更新 更多