如何发送数组项哈希值的哈希值到csv



值的哈希正确打印到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 tn";
          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无论是在一个单元格或在多个单元格。由于

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

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

看起来你不担心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 );
}

最新更新