2016-05-17 19 views
2

Ich habe den folgenden Code, der Daten an eine CSV übergibt, aber die Reihenfolge der Spalten in der CSV ist scheinbar zufällig (ich übergebe einen Hash an die CSV). Ich habe echte Schwierigkeit, die Reihenfolge der Spalten zu definieren.Fix Hash-Positionen in Hash

Gibt es eine Möglichkeit, die Position von Hashes in meinem% output_var Hash zu fixieren, so dass ich die Spaltenreihenfolge in meiner CSV effektiv definieren kann?

$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:

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; 
} 

Antwort

5

Wenn Sie wurden mit Text sind :: CSV oder Text :: CSV_XS,

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

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

Aber Sie scheinen auch nicht verwenden werden von diesen Modulen (?!?!), also

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

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

Das ist wirklich cool. Um mehr darüber zu erfahren, wie/warum das funktioniert, google "perl hash slice". Beachten Sie die Syntax '@ $ order {@headers}'. Sie könnten denken, Sie könnten auch so etwas tun, aber Sie können nicht. '$ order -> {@ headers}' – Mort

+1

@Mort, Sie können jedoch seit dem 5.24 ['$ order-> @ {@headers}'] (http://www.perlmonks.org/?node_id=977408) machen (oder seit 5.20, wenn Sie 'use feature qw (posderef) verwenden;' und 'no warns qw (experimental :: postderef);'); – ikegami