2016-05-17 69 views
2

我有以下代码将数据传递给csv,但CSV中的列顺序看起来是随机的(我将散列传递给CSV)。我很难定义列的顺序。修复散列中的散列位置

有没有一种方法可以修复哈希在我的%output_var哈希中的位置,这样我就可以在CSV中有效地定义列顺序了?

$common->print_header('text/csv','export_order_products.csv'); 
print common::to_csv(sort values %output_var)."\r\n"; 
my $cart_id; 
foreach my $order (@data_to_export) { 
    $order->{'order-id'} =~ s/\.cgi//; 
    $order->{'order-item-id'} =~ s/\.cgi//; 
    $order->{'purchase-date'} =~ s/\.cgi//; 
    my @line; 
    for (sort {$output_var{$a} cmp $output_var{$b}; } keys %output_var) { 
    push @line, $order->{$_}; 
    } 
    print common::to_csv(@line)."\r\n"; 
       } 

CSV子:

sub to_csv { 
    my ($csv_line); 
    my (@fields) = @_; 
    my $i; 
    for ($i=0; $i<scalar(@fields); $i++) { 
     $fields[$i] =~ s/\r/\\r/gis; 
     $fields[$i] =~ s/\n/\\n/gis; 
     $fields[$i] =~ s/"/""/gis; # -- " 
     $fields[$i] =~ s/(.*,.*)/"$1"/gis; 
     $fields[$i] = '' if ($fields[$i] eq '0'); 
    } 
    $csv_line = join ',', @fields; 
    return $csv_line; 
} 

回答

5

如果你正在使用文字:: CSV或文本:: CSV_XS,

# Outside the loop 
$csv->column_names([qw(...)]); 

# Inside the loop 
$csv->print_hr($fh, $order); 

但你似乎没有使用任何这些模块(?!?!),所以

# Outside the loop 
my @headers = qw(...); 

# Inside the loop 
print($fh to_csv(@$order{@headers}), "\r\n"); 
+0

这真的很酷。要了解更多关于如何/为什么这会工作,谷歌“perl哈希切片”。请注意'@ $ order {@headers}'的语法。你可能会认为你也可以做这样的事情,但你做不到。 '$ order - > {@ headers}' – Mort

+1

@Mort,但是,您可以['$ order-> @ {@headers}'](http://www.perlmonks.org/?node_id=977408)自5.24 (或者从5.20开始,如果你使用'use feature qw(postderef);'和'no warnings qw(experimental :: postderef);'); – ikegami