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;
}
これは本当にクールです。どのように/なぜこれが動作するかについて詳しくは、Googleの "perl hash slice"を参照してください。 '@ $ order {@headers} 'という構文に注意してください。このようなこともできると思うかもしれませんが、できません。 '$ order - > {@headers}' – Mort
@Mortしかし、5.24以降、['$ order-> @ {@headers}'](http://www.perlmonks.org/?node_id=977408)を行うことができます(または、 'use feature qw(postderef);' 'と' '警告なしqw(experimental :: postderef);' 'を使用すると5.20以降)。 – ikegami