2015-10-12 49 views
0

哈希數值散列正確地打印到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 \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);> 

如果我註釋掉打印陣列部分,然後代碼工作fine.Can有人請建議如何打印數組元素爲CSV無論是在一個小區或多個cells.Thanks

回答

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); 
} 
+0

不幸的是我不能使用module.But我會嘗試這個連接提示。我會讓你知道謝謝 – Perl

+0

這真的是「做」 CSV數據的最簡單的方法。當然,考慮到多線路地址,這不一定是首先要做的正確途徑。你考慮過XML輸出嗎? – Sobrique

+0

實際上,一旦我能夠打印多行地址以及在csv中,我認爲執行排序,以便命令將是學生名稱,然後DOB然後地址。我正在努力打印這個多行地址,我必須在不使用module的情況下執行此操作。我將按照建議嘗試使用XML進行打印。謝謝 – Perl