Эта тема на forum.dklab.ru


Bolt: sort
Втягиваю csv(строк в нем от 5 до 40) вида:

текстовое поле;10;5;5;;;;7;6;6;7;7;5;6;6;6;6;7;8;8;9;6;;;;;4;;6;7;7;9;9;10;172
текстовое поле;;;;;;;;;;;;;;;;;;;7;7;5;;;;;;;5;4;5;;;;33
текстовое поле;5;3;2;;;;8;4;5;6;4;6;;;;5;5;7;9;9;7;;;;3;3;4;5;4;5;7;7;7;130

в массив @csvdata
последняя запись каждой строки (с индексом 34) - сумма всех цыфр строки. т.о. она есть всегда(defined)
вот по этой сумме и хочется отсортировать массив:
@stddata = sort { (split /";"/, $b)[34] <=> (split /";"/, $a)[34]; } @csvdata;
не-а, не тут-то было. не сортирует.
Не подскажете в чем ошибка?
Enilatiar:
Вы ошиблись в кавычках и в контексте скобок.

#!Perl -w
use strict;

my @csvdata = ();
while (<DATA>) {
chomp;
next if /^\s*$/;
push @csvdata, $_;
}

my @stddata = sort { +(split /;/, $b)[34] <=> +(split /;/, $a)[34] } @csvdata;

print "$_\n" foreach @stddata;

__DATA__
текстовое поле;10;5;5;;;;7;6;6;7;7;5;6;6;6;6;7;8;8;9;6;;;;;4;;6;7;7;9;9;10;172
текстовое поле;;;;;;;;;;;;;;;;;;;7;7;5;;;;;;;5;4;5;;;;33
текстовое поле;5;3;2;;;;8;4;5;6;4;6;;;;5;5;7;9;9;7;;;;3;3;4;5;4;5;7;7;7;130
Дмитрий Котеров:
А плюсики зачем? Разве без них не работает?
Enilatiar:
Плюсики определяют контекст. Без них скобки () не клеятся к [].
Впрочем, без них работает. ;) Так что не прав. Перепредостерегся.
Bolt:
:) Премного благодарен.
это работает:
@stddata = sort { (split /;/, $b)[34] <=> (split /;/, $a)[34]; } @csvdata;
действительно перемудрил с кавычками.
Enilatiar:
Точку с запятой из середины убрали бы. ;)
Дмитрий Котеров:
В смысле, перед "}". Она там и вправду необязательна.
Enilatiar:
;)
Это смайл. :)
Дмитрий Бойков:
Осенна удобна однако! 8)

#Сортировка строк по полям, разделенным символом.
#Например, хочу отсортировать строки, разделенные на поля запятой,
sub fieldsort {
my ($sep, $cols);
if (ref $_[0]) {
$sep = '\\s+'
} else {
$sep = shift;
}
unless (ref($cols = shift) eq 'ARRAY') {
die "fieldsort columns must be in anon array";
}
my (@sortcode, @col);
my $col = 1;
for (@$cols) {
my ($a, $b) = /^-/ ? qw(b a) : qw(a b);
my $op = /n$/ ? '<=>' : 'cmp';
push @col, (/(\d+)/)[0] - 1;
push @sortcode, "\$${a}->[$col] $op \$${b}->[$col]";
$col++;
}
my $sortfunc = eval "sub { " . join (" or ", @sortcode) . " } ";
my $splitfunc = eval 'sub { (split /$sep/o, $_)[@col] } ';
return
map $_->[0],
sort { $sortfunc->() }
map [$_, $splitfunc->($_)],
@_;
}
#Примеры:
#сначала по второму полю по числам, затем по первому полю по алфавиту в порядке убывания.
#@sorted = fieldsort ':', ['2n', -1], @data;
# по 2-му затем по 1-му полю, по алфавиту, разделены пробелами
#@sorted = fieldsort [2, 1], @data;
# по 1-му полю по числам в порядке убывания, затем по 3-му полю
# по алфавиту и по 2-му по числам, поля разделены '+'
#@sorted = fieldsort '+', ['-1n', 3, 2], @data;


Удачи.
Дмитрий Котеров:
Да, неплохо. Спасибо.
Дмитрий Эсс:
Переношу тему по
просьбе автора.
Дмитрий Эсс:
Перенесено из форума: Программирование::Perl::Все в кучу.
Перенесено в форум: Программирование::Perl::Склад готовых решений.

Эта тема на forum.dklab.ru