我有以下代码将数据传递给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:
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;
}
答案 0 :(得分:5)
如果您使用的是Text :: CSV或Text :: 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");