Как указано в моем комментарии, описание проблемы неполное.Мое решение предполагает:
- ключи хеш-функции имеют имена
column1
, ..., column9
, column10
и т. Д., Т. Е. Столбцы в сгенерированном CSV должны быть отсортированы в числовом виде повнедренное число. - самый длинный массив определяет, сколько строк должно быть в сгенерированном CSV, т.е. неопределенные значения должны отображаться в пустые ячейки.
#!/usr/bin/perl
use strict;
use warnings;
use List::Util qw(max);
use Text::CSV;
# read in hash-of-arrays
my %hash;
while (<DATA>) {
chomp;
my($column, @values) = split(' ');
$hash{$column} = \@values;
}
# column sort order (using Schwartzian transform)
my @column_order =
map { $_->[0] } # [ "columnN", N ] -> "columnN"
sort { $a->[1] <=> $b->[1] } # numerical sort, ascending
map { [ /^(column(\d+))$/ ] } # "columnN" -> [ "columnN", N ]
keys %hash;
# calculate highest array index
my $max_index =
max
map { $#{ $_ } }
values %hash;
# transpose hash-of-arrays and print CSV to STDOUT
my $csv = Text::CSV->new();
$csv->eol("\n");
$csv->print(\*STDOUT, \@column_order);
for my $index (0..$max_index) {
my @row =
map { $hash{$_}->[$index] // '' }
@column_order;
$csv->print(\*STDOUT, \@row);
}
exit 0;
__DATA__
column1 1 2 3
column2 4 5 6 7
column3 8 9
column4 10 11 12
column5 13 14 15 16 17 18
column6
column7 19 20 21 22
column8 23
column9 24 25 26
column10 27 28 29 30
Запуск со встроенными тестовыми данными
$ perl dummy.pl
column1,column2,column3,column4,column5,column6,column7,column8,column9,column10
1,4,8,10,13,,19,23,24,27
2,5,9,11,14,,20,,25,28
3,6,,12,15,,21,,26,29
,7,,,16,,22,,,30
,,,,17,,,,,
,,,,18,,,,,