![]() |
|
||||||||||
|
|||||
|
Вопрос
есть текстовый файл с такими полями Ваня|10|Москва Петя|5|Уфа Иван|7|Питер как отсортировать эти строки к примеру по второму полю? То бишь, чтобы потом получилось нечто такое Петя|5|Уфа Иван|7|Питер Ваня|10|Москва знаю про функцию split, про sort тоже но как их применить к этому случаю? взаранее спасибо...
__________________
design for underground - http://mpak.dax.ru |
|
|||||
|
Если не заморачиваться с хэшами, многомерными массивами, объектами и т.п.
то вот простой вариант:$datafile = "Ваня|10|Москва\n".
"Петя|5|Уфа\n".
"Иван|7|Питер";
@data = split(/\r?\n/,$datafile);
@sortdata = &mysort(1,1,0,@data);
...
exit;
sub mysort {
my $field = shift; # - номер поля для сортировки
my $type = shift; # - тип поля (0-стринг, 1-число)
my $revers = shift; # - 1=обратная сортировка
my @result = @_;
if ($type) {
@result = sort {
my @data1 = split(/\|/,$a);
my @data2 = split(/\|/,$b);
return $data1[$field]<=>$data2[$field];
} @result;
} else {
@result = sort {
my @data1 = split(/\|/,$a);
my @data2 = split(/\|/,$b);
return ($data1[$field] lt $data2[$field]) ? -1 : ($data1[$field] gt $data2[$field]) ? 1 : 0;
} @result;
}
@result = reverse @result if ($revers);
return @result;
}
__________________
Two beer or not two beer?... |
|
|||||
|
СПАСИБО!
СУПЕР! SPV - МОЗГ! ![]()
__________________
design for underground - http://mpak.dax.ru |
|
|||||
|
SPV - пожалуйста еще раз, чего то у меня глючит.
Ситуация примерно такая же, только я данные читаю из файла: open (DB, "$alexdata") || print "Cant open DataBase file : $!"; @db = <DB>; close (DB); foreach $line (@db) { # split the fields at the | character @record = split(/\|/,$line); #################### #здесь я определяю метод сортировки if ($sorts eq "a1"){@sortrecord = &mysort(1,0,0,@record);} if ($sorts eq "a1"){@sortrecord = &mysort(1,0,1,@record);} if ($sorts eq "d1"){@sortrecord = &mysort(6,1,0,@record);} if ($sorts eq "d1"){@sortrecord = &mysort(6,1,1,@record);} else {@sortrecord = &mysort(6,1,0,@record);} #################### $linkcategory = $record[0]; $linktitle = $record[1]; $linkurl = $record[2]; $linkdesc = $record[3]; $linkemail = $record[4]; $linkdate = $record[5]; $linkadd_time = $record[6]; .............................. потом я их вывожу на печать } Как бы их отсортировать, например по полю $linktitle. Я пробую твой способ - Перл ругается (ошибка) на функцию my sort, примерно начиная с if ($type) { @result = sort { my @data1 = split(/\|/,$a); my @data2 = split(/\|/,$b); return $data1[$field]<=>$data2[$field]; может что то с переменными? что такое $a и $b? Глянь, пожалуйста, где глюк - по моему я что то не так делаю. Заранее благодарен.
__________________
With the best regards Alex V. White |
|
|||||
|
Процедура сортирует всю таблицу сразу, а не отдельные записи. Т.е. читаешь файл, сортируешь, а уже потом отсортированный результат разбиваешь по записям:
open (DB, "$alexdata") || print "Cant open DataBase file : $!"; @db = <DB>; close (DB); if ($sorts eq "a1"){@sortdb = &mysort(1,0,0,@db);} if ($sorts eq "d1"){@sortdb = &mysort(6,1,0,@db);} ... foreach $line (@sortdb) { @record = split(/\|/,$line); $linkcategory = $record[0]; ... } ЗЫ if ($sorts eq "a1"){@sortrecord = &mysort(1,0,0,@record);} if ($sorts eq "a1"){@sortrecord = &mysort(1,0,1,@record);} Это не опечатка? (абсолютно одинаковые условия...)
__________________
Two beer or not two beer?... |
|
|||||
|
Конечно опечатка. СПАСИБО!
Сейчас буду пробовать...
__________________
With the best regards Alex V. White |
|
|||||
|
Сделал все - СПАСИБО БОЛЬШУЩЕЕ!
Вопрос следующий, может ты сталкивался, - как ты понял, я открываю текстовую бызу данных, сортирую и вовожу на екран (это каталог ссылок). Дык вот, начал я ее вчера наполнять - беру данные из текстового файла, копирую и встовляю в форму добавить ссылку (это все происходит на локальной машине, у меня Апач и Перл стоят). Все здорово, где то ссылки после 50 решил глянуть что вышло и как сортирует - по дате добавления все на ура (числовое поле), а вот по названию (текстовое) чего то непонятное выдает, т.е. понять как он это отсортировал не возможно. Думаю чего то он с буквами русскими не поделил, открыл файл базы и ручками перенабрал названия, дык после этого он вообще отказался сортировать по названию (думает долго и ничего не выдает, бывает такое когда какой то несущественный глюк в проге), а по дате на ура. Еще одно - если урезать базу записей до 20-30 - сортирует, но опять непонятно как. Если ты не задолбался читать (столь простанно - для полноты понимания) - подскажи плиз, если какие мысли есть. Спасибо.
__________________
With the best regards Alex V. White |
|
|||||
|
Чтобы перл мог нормально сортировать русские строки, ему нужно переключить в начале кодировку... Как-то так:
use locale; use POSIX qw(locale_h); setlocale("LC_ALL", "ru_RU.CP1251"); или setlocale("LC_ALL", "ru_RU.KOI8-R"); А по поводу изменения руками - тут проверять нужно, правильно ли файл сохраняется - не появляется ли там пустых строк, виндовых "возвратов коретки" \r и т.п...
__________________
Two beer or not two beer?... |
|
|||||
|
По моему он грузнит на таком колличестве записей. Сделать чтоли базу ДБМ файлом?
__________________
With the best regards Alex V. White |
|
|||||
|
А ещё лучше MySQL
![]()
__________________
Two beer or not two beer?... |
![]() |
Часовой пояс GMT +4, время: 02:47. |
|
|
« Предыдущая тема | Следующая тема » |
|
|