Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка строк в файле 
:(
    Опции темы
vitR
Дата 12.6.2006, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 12.6.2006

Репутация: нет
Всего: нет



Приветствую всех.
Возникла необходимо отсортировать строки заключенные между ограничителями (Т[1-8]). Вот пример файла:
M48
METRIC,0000.00
T01C0.80
T02C0.90
T03C1.00
%
T02
X+010670Y-002440
X+010670Y-002930
T03
X+010537Y+002930
X+002660Y-003172
T04
X+011020Y-003550
X+010520Y-003550
T05
X+011310Y+003070
X+012990Y+003070
T08
X+006480Y+000230
X+009620Y+004110
T00
M30

Сама сортирвка реализована так:
Код

#!/usr/bin/perl
%h = ();
open( F, "file" ) or die "Can't open source file: $!\n";
while( <F> ){
    ($x, $y) = split;
    push( @{$h{$x}}, $y );
}
foreach $x (sort keys %h){
    print"$x: @{$h{$x}}\n";
}
close( F ) or die "Can't close file: $!\n";

Пример честно содран из Perl Cookbook
Как выделить строки заключенные между ограничителями?
Хочется примерно такого:
Пока не найден первый ограничитель - выводим на STDIN.
Нашли первый ограничитель - читаем строки до тех пор пока не будет найден следующий(его не включаем). Сортируем. Выводим в STDIN. И т.д. Когда нашли Т0, то его и всё что после, выводим в STDIN.
Для меня явилось проблемой передать положение файлового указателя.
Пните в нужную сторону.
PM MAIL   Вверх
Ivan Kolesnikov
Дата 16.6.2006, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 9.3.2005
Где: г. Новокузнецк

Репутация: 3
Всего: 6



Привет, что-то я не понял зачем ты привел этот пример, тебе ведь надо просто отсортировать, зачем использовать хеш?

Как бы делал я: ввел бы переменную, которая определяла что мне нужно сделать с новой прочитанной строкой: если она ИСТИНА, то значит необходимо добавить строку в буфер (массив), если же она ЛОЖ, то напрямую выводим ее в результирующий файл.

Теперь сам алгоритм: сначала эта переменная лож, и мы все выводим в файл, при этом смотрим если прочитанная строка имеет шабло: /T\d{2}/, то значит нужно вывести в файл содержимое буфера в отсортированном порядке, а затем и ее. Если же прочитанная строка T00, то и изменить значение описанной выше переменой и снова выводить все подряд в ответ.

Вот примерная реализация:
Код

use strict;

open (IN,  "<1.txt");
open (OUT, ">2.txt");

my @buffer;
my $save_to_buffer;

while (my $line=<IN>) {
  chomp $line;
  my $tag = $line =~ /^T\d{2}$/;
  if ($tag) {
    print OUT "$_\n" foreach sort @buffer;
    @buffer = ();
    $save_to_buffer = $line ne "T00";
  };
  if ($tag || !$save_to_buffer) {
    print OUT "$line\n";
  } else {
    push @buffer, $line;
  }
};

close(IN);
close(OUT);
 
--------------------
PM MAIL ICQ   Вверх
vitR
Дата 21.6.2006, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 12.6.2006

Репутация: нет
Всего: нет



Спасибо, Иван, за ответ. То, что нужно!
А такая сортировка была необходима для того, чтобы не терять пары значений.____
Но алгоритм был немного другой. Вот и взял не раздумывая... 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0423 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.