Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Архив Flasher.ru > Программирование > Perl

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 07.11.2002, 16:18
MpaK999 вне форума Посмотреть профиль Отправить личное сообщение для MpaK999 Посетить домашнюю страницу MpaK999 Найти все сообщения от MpaK999
  № 1  
MpaK999

Регистрация: Apr 2002
Адрес: Russia/Ufa
Сообщений: 85
Отправить сообщение для MpaK999 с помощью ICQ
По умолчанию Сортировка по текстовым полям

Вопрос

есть текстовый файл с такими полями

Ваня|10|Москва
Петя|5|Уфа
Иван|7|Питер

как отсортировать эти строки к примеру по второму полю?
То бишь, чтобы потом получилось нечто такое

Петя|5|Уфа
Иван|7|Питер
Ваня|10|Москва

знаю про функцию split, про sort тоже но как их применить к этому случаю?

взаранее спасибо...
__________________
design for underground - http://mpak.dax.ru

Старый 08.11.2002, 12:09
SPV вне форума Посмотреть профиль Отправить личное сообщение для SPV Найти все сообщения от SPV
  № 2  
SPV
 
Аватар для SPV

Регистрация: Jan 2000
Адрес: St-Petersburg
Сообщений: 1,229
Отправить сообщение для SPV с помощью ICQ
Если не заморачиваться с хэшами, многомерными массивами, объектами и т.п. то вот простой вариант:
Код:
$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?...

Старый 08.11.2002, 16:14
MpaK999 вне форума Посмотреть профиль Отправить личное сообщение для MpaK999 Посетить домашнюю страницу MpaK999 Найти все сообщения от MpaK999
  № 3  
MpaK999

Регистрация: Apr 2002
Адрес: Russia/Ufa
Сообщений: 85
Отправить сообщение для MpaK999 с помощью ICQ
По умолчанию СПАСИБО

СПАСИБО!
СУПЕР!
SPV - МОЗГ!
__________________
design for underground - http://mpak.dax.ru

Старый 24.01.2003, 19:24
Alex V. White вне форума Посмотреть профиль Отправить личное сообщение для Alex V. White Посетить домашнюю страницу Alex V. White Найти все сообщения от Alex V. White
  № 4  
Alex V. White

Регистрация: Jul 2000
Адрес: Ukraine, Kiev
Сообщений: 102
Отправить сообщение для Alex V. White с помощью ICQ
По умолчанию Вопрос к SPV

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

Старый 24.01.2003, 19:35
SPV вне форума Посмотреть профиль Отправить личное сообщение для SPV Найти все сообщения от SPV
  № 5  
SPV
 
Аватар для SPV

Регистрация: Jan 2000
Адрес: St-Petersburg
Сообщений: 1,229
Отправить сообщение для SPV с помощью ICQ
Процедура сортирует всю таблицу сразу, а не отдельные записи. Т.е. читаешь файл, сортируешь, а уже потом отсортированный результат разбиваешь по записям:

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?...

Старый 24.01.2003, 19:53
Alex V. White вне форума Посмотреть профиль Отправить личное сообщение для Alex V. White Посетить домашнюю страницу Alex V. White Найти все сообщения от Alex V. White
  № 6  
Alex V. White

Регистрация: Jul 2000
Адрес: Ukraine, Kiev
Сообщений: 102
Отправить сообщение для Alex V. White с помощью ICQ
Конечно опечатка. СПАСИБО!
Сейчас буду пробовать...
__________________
With the best regards
Alex V. White

Старый 12.02.2003, 19:45
Alex V. White вне форума Посмотреть профиль Отправить личное сообщение для Alex V. White Посетить домашнюю страницу Alex V. White Найти все сообщения от Alex V. White
  № 7  
Alex V. White

Регистрация: Jul 2000
Адрес: Ukraine, Kiev
Сообщений: 102
Отправить сообщение для Alex V. White с помощью ICQ
По умолчанию Еще вопрос к SPV

Сделал все - СПАСИБО БОЛЬШУЩЕЕ!
Вопрос следующий, может ты сталкивался, - как ты понял, я открываю текстовую бызу данных, сортирую и вовожу на екран (это каталог ссылок). Дык вот, начал я ее вчера наполнять - беру данные из текстового файла, копирую и встовляю в форму добавить ссылку (это все происходит на локальной машине, у меня Апач и Перл стоят). Все здорово, где то ссылки после 50 решил глянуть что вышло и как сортирует - по дате добавления все на ура (числовое поле), а вот по названию (текстовое) чего то непонятное выдает, т.е. понять как он это отсортировал не возможно. Думаю чего то он с буквами русскими не поделил, открыл файл базы и ручками перенабрал названия, дык после этого он вообще отказался сортировать по названию (думает долго и ничего не выдает, бывает такое когда какой то несущественный глюк в проге), а по дате на ура. Еще одно - если урезать базу записей до 20-30 - сортирует, но опять непонятно как.
Если ты не задолбался читать (столь простанно - для полноты понимания) - подскажи плиз, если какие мысли есть.
Спасибо.
__________________
With the best regards
Alex V. White

Старый 12.02.2003, 20:13
SPV вне форума Посмотреть профиль Отправить личное сообщение для SPV Найти все сообщения от SPV
  № 8  
SPV
 
Аватар для SPV

Регистрация: Jan 2000
Адрес: St-Petersburg
Сообщений: 1,229
Отправить сообщение для SPV с помощью ICQ
Чтобы перл мог нормально сортировать русские строки, ему нужно переключить в начале кодировку... Как-то так:
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?...

Старый 13.02.2003, 12:49
Alex V. White вне форума Посмотреть профиль Отправить личное сообщение для Alex V. White Посетить домашнюю страницу Alex V. White Найти все сообщения от Alex V. White
  № 9  
Alex V. White

Регистрация: Jul 2000
Адрес: Ukraine, Kiev
Сообщений: 102
Отправить сообщение для Alex V. White с помощью ICQ
По моему он грузнит на таком колличестве записей. Сделать чтоли базу ДБМ файлом?
__________________
With the best regards
Alex V. White

Старый 13.02.2003, 13:07
SPV вне форума Посмотреть профиль Отправить личное сообщение для SPV Найти все сообщения от SPV
  № 10  
SPV
 
Аватар для SPV

Регистрация: Jan 2000
Адрес: St-Petersburg
Сообщений: 1,229
Отправить сообщение для SPV с помощью ICQ
А ещё лучше MySQL
__________________
Two beer or not two beer?...

Создать новую тему   Часовой пояс GMT +4, время: 20:39.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 20:39.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.