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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> файл, двойной проход 
V
    Опции темы
Bulat
Дата 8.9.2006, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

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



Нужно два раза пройти по файлу(сам файл такой поэтому два раза), только один проход будет лежать в цикле другого.
А проблема в том что я начинаю один раз вытаскивать строки из файла, при обработке строки, захожу начинаю еще раз обрабатывать строки, и когда внутрення обработка заканчивается, внешняя обработка строк файла уже продолжается там где закончилась внутренняя, а мне нужно там где остановилась внешняя обработка.
Код

open(SourceF, "$qlogdir/$logfile");
{
    while (!eof SourceF)
    {
        my $line;
        $line=<SourceF>;
        chomp(line);
        if($line=~m....) 
        {
             ....
             while(!eof SourceF)
             {
              ....
             }
         }
    }
}



--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
ZeeLax
Дата 8.9.2006, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 4388
Регистрация: 20.8.2006
Где: Алма-Ата

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



Открой его два раза привязывя к разным файловым переменным. А к чему такая необходимость, два раза по файлу проходить?


--------------------
Utility is when you have one telephone, luxury is when you have two, opulence is when you have three — and paradise is when you have none.
— Doug Larson
PM MAIL WWW ICQ Skype Jabber   Вверх
Bulat
Дата 8.9.2006, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

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



Цитата(ZeeLax @  8.9.2006,  13:26 Найти цитируемый пост)
чему такая необходимость

файл логов такой, все разбросано, иного способа не нашел как дважды smile 


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Nab
Дата 8.9.2006, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Смотри функции tell, seek

А вообще это не правильно, в особенности если файл - лог, я думаю вполне посильно сделать его однопроходным

ну или так:

Код

# это будет буффер для прочитанных строк во внутреннем цикле.
my @lines = ();
open(SourceF, "$qlogdir/$logfile");    
{    
    while (!eof SourceF)    
    {    
        my $line;    
        # читаем из списка, а если он уже пустой, то из файла
        $line= shift(@lines) || <SourceF>;    
        chomp(line);    
        if($line=~m....)    
        {    
             ....    
             
             while(!eof SourceF)    
             {    
                  $line= <SourceF>;    
                  # сохраняем прочитанную строку, чтоб второй раз не проходить.
                  push @lines, $line;
                  ....    
                  # что-то делаешь с $line
             }    
         }    
    }    
}



--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
ZeeLax
Дата 8.9.2006, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 4388
Регистрация: 20.8.2006
Где: Алма-Ата

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



Nab, согласен.
Bulat, можешь кусок лога дать? Или он секретный?


--------------------
Utility is when you have one telephone, luxury is when you have two, opulence is when you have three — and paradise is when you have none.
— Doug Larson
PM MAIL WWW ICQ Skype Jabber   Вверх
Bulat
Дата 8.9.2006, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

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



ZeeLax, qmail'ский лог файл, там инфа об отправленных письмах в разных строчках, с разными уидами идет и в разброс, еще информация об одном сообщении не закончилась, а уже о другом идет, вот и приходится двойной обход


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Nab
Дата 8.9.2006, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Bulat @  8.9.2006,  13:53 Найти цитируемый пост)
ZeeLax, qmail'ский лог файл, там инфа об отправленных письмах в разных строчках, с разными уидами идет и в разброс, еще информация об одном сообщении не закончилась, а уже о другом идет, вот и приходится двойной обход


Ну так а почему его однопроходным сделать нельзя? Ведь есть какая-то уникальная инфа в каждой строке, позволяющая соотнести ее к какому-то одному сообщению. Вот и коллекционируй их в именованные списки, а когда сообщение обработаешь освобождай память

Код

%collection = ();
if open(SourceF, "$qlogdir/$logfile") {     
    while (<SourceF>)     
    {     
         chomp;
        # выделяешь уникальность строки
        /.*uid=(\d+).*/; #это пример, я не знаю как там верно это указывается....
        # заносишь в коллекцию
        push(@{$collection{$1}}, $_);
        
        # определяешь последняя ли это строчка в сообщении
        if (/.*uid=(\d+)\s*end.*/) { #опять-же это пример, я не знаю как там верно это указывается....

            # дальше делаешь что-то с ообщением сохраненном в $collection($1)
            foreach(@{$collection{$1}}) { ... }
            # освобождаешь память 
            delete $collection{$1};
    }     
    close SourceF;
}

# а здесь можна обработать сообщения, конец которых мы не нашли в файле
foreach (keys %collection) { 
            foreach(@{$collection{$_}}) { ... }
}


Приблизительно вот так, я код не проверял, но идея надеюсь будет понятна...

Это сообщение отредактировал(а) Nab - 11.9.2006, 14:35


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
Bulat
Дата 8.9.2006, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

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



Цитата(Nab @  8.9.2006,  14:15 Найти цитируемый пост)
Ведь есть какая-то уникальная инфа в каждой строке

вот именно что такой нет, точнее сказать она дублируется, притом по ней к другого рода строке вешается иной уид, вообщем если конечно показать сам увидишь что такого нет......... Если бы так было то другое дело, или хотя бы инфа об одном сообщении была бы в одной строке  smile 


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Nab
Дата 8.9.2006, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Bulat @  8.9.2006,  16:09 Найти цитируемый пост)
вот именно что такой нет, точнее сказать она дублируется, притом по ней к другого рода строке вешается иной уид, вообщем если конечно показать сам увидишь что такого нет......... Если бы так было то другое дело, или хотя бы инфа об одном сообщении была бы в одной строке  smile 

Но ведь как-то же ты соотносишь между собой строки во внутреннем цикле, вот и разноси их в разные списки.
Ну или используй конечный автомат, с сохранением состояния...

Короче, не верю что этот алгоритм нельзя сделать однопроходным smile


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
ZeeLax
Дата 8.9.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 4388
Регистрация: 20.8.2006
Где: Алма-Ата

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



Цитата(Bulat @  8.9.2006,  19:09 Найти цитируемый пост)
вот именно что такой нет, точнее сказать она дублируется, притом по ней к другого рода строке вешается иной уид, вообщем если конечно показать сам увидишь что такого нет......... Если бы так было то другое дело, или хотя бы инфа об одном сообщении была бы в одной строке  

У меня не qmail, у меня postfix, но, я думаю, там похожая ситуёвина. Поизучал лог - можно сделать в один проход.


--------------------
Utility is when you have one telephone, luxury is when you have two, opulence is when you have three — and paradise is when you have none.
— Doug Larson
PM MAIL WWW ICQ Skype Jabber   Вверх
Bulat
Дата 11.9.2006, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

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



ZeeLax, во-первых, я уже неделю изучал и говорю что нет! smile 
Во-вторых, это можно настроить, вообще как любое приложение можно под себя отредактировать(ну почти любое), только наши технари не могут это сделать, а мы на С не пишем, чтоб отредактировать smile 


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Bulat
Дата 11.9.2006, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

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



Цитата

Sep  1 00:00:00 saracen qmail: 1157054400.764591 new msg 2522767
Sep  1 00:00:00 saracen qmail: 1157054400.764646 info msg 2522767: bytes 2417 from <[email protected]> qp 23970 uid 1911
Sep  1 00:00:00 saracen qmail: 1157054400.818757 starting delivery 117504: msg 2522767 to local [email protected]
Sep  1 00:00:00 saracen qmail: 1157054400.818776 status: local 1/10 remote 2/20
Sep  1 00:00:00 saracen qmail: 1157054400.869857 new msg 2522784
Sep  1 00:00:00 saracen qmail: 1157054400.869983 info msg 2522784: bytes 2521 from <[email protected]> qp 23976 uid 89
Sep  1 00:00:00 saracen qmail: 1157054400.930823 starting delivery 117505: msg 2522784 to local [email protected]
Sep  1 00:00:00 saracen qmail: 1157054400.930851 status: local 2/10 remote 2/20
Sep  1 00:00:00 saracen qmail: 1157054400.930873 delivery 117504: success: did_0+0+1/
Sep  1 00:00:00 saracen qmail: 1157054400.931000 status: local 1/10 remote 2/20
Sep  1 00:00:00 saracen qmail: 1157054400.931064 end msg 2522767
Sep  1 00:00:00 saracen qmail: 1157054400.956808 delivery 117505: success: did_0+0+1/
Sep  1 00:00:00 saracen qmail: 1157054400.956926 status: local 0/10 remote 2/20
Sep  1 00:00:00 saracen qmail: 1157054400.956988 end msg 2522784
Sep  1 00:00:01 saracen qmail: 1157054401.568375 new msg 2522784
Sep  1 00:00:01 saracen qmail: 1157054401.568430 info msg 2522784: bytes 568 from <[email protected]> qp 23983 uid 1911
Sep  1 00:00:01 saracen qmail: 1157054401.623410 starting delivery 117506: msg 2522784 to local [email protected]
Sep  1 00:00:01 saracen qmail: 1157054401.623460 status: local 1/10 remote 2/20
Sep  1 00:00:01 saracen qmail: 1157054401.715814 new msg 2522787
Sep  1 00:00:01 saracen qmail: 1157054401.715979 info msg 2522787: bytes 667 from <[email protected]> qp 23987 uid 89
Sep  1 00:00:01 saracen qmail: 1157054401.795173 starting delivery 117507: msg 2522787 to local [email protected]
Sep  1 00:00:01 saracen qmail: 1157054401.795247 status: local 2/10 remote 2/20
Sep  1 00:00:01 saracen qmail: 1157054401.795268 delivery 117506: success: did_0+0+1/
Sep  1 00:00:01 saracen qmail: 1157054401.795438 status: local 1/10 remote 2/20
Sep  1 00:00:01 saracen qmail: 1157054401.795464 end msg 2522784
Sep  1 00:00:01 saracen qmail: 1157054401.795749 new msg 2522767
Sep  1 00:00:01 saracen qmail: 1157054401.795773 info msg 2522767: bytes 3689 from <[email protected]> qp 23981 uid 1911
Sep  1 00:00:01 saracen qmail: 1157054401.863007 starting delivery 117508: msg 2522767 to local [email protected]
Sep  1 00:00:01 saracen qmail: 1157054401.863078 status: local 2/10 remote 2/20
Sep  1 00:00:01 saracen qmail: 1157054401.863098 delivery 117507: success: did_0+0+1/
Sep  1 00:00:01 saracen qmail: 1157054401.863317 status: local 1/10 remote 2/20
Sep  1 00:00:01 saracen qmail: 1157054401.863341 end msg 2522787
Sep  1 00:00:01 saracen qmail: 1157054401.874214 delivery 117508: success: did_0+0+1/
Sep  1 00:00:01 saracen qmail: 1157054401.874383 status: local 0/10 remote 2/20
Sep  1 00:00:01 saracen qmail: 1157054401.874427 end msg 2522767
Sep  1 00:00:02 saracen qmail: 1157054402.255529 delivery 117503: failure: 205.178.149.7_does_not_like_recipient./Remote_host_
said:_550_5.2.1_<[email protected]>..._Mailbox_disabled_for_this_recipient/Giving_up_on_205.178.149.7./
Sep  1 00:00:02 saracen qmail: 1157054402.255791 status: local 0/10 remote 1/20
Sep  1 00:00:02 saracen qmail: 1157054402.339387 bounce msg 2522781 qp 24018
Sep  1 00:00:02 saracen qmail: 1157054402.339438 end msg 2522781
Sep  1 00:00:02 saracen qmail: 1157054402.339648 new msg 2522754
Sep  1 00:00:02 saracen qmail: 1157054402.339728 info msg 2522754: bytes 5577 from <#@[]> qp 24018 uid 1026
Sep  1 00:00:02 saracen qmail: 1157054402.405922 starting delivery 117509: msg 2522754 to local [email protected]
Sep  1 00:00:02 saracen qmail: 1157054402.405944 status: local 1/10 remote 1/20


вот вам кусочек логов.........


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Nab
Дата 11.9.2006, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Bulat, не надо злиться, не он к Вам с вопросом пришел...
А если Вы не знаете КАК это сделать, то это не значит что это вообще не возможно, скромнее быть нужно.
Логи в принципе выдаются последовательно по мере обработки информации, и как правило могут быть также просто обработаны в один проход... Возможно с временными буферами, как я предложил...
А вы мой код видно даже не пытались применить, потому как я там ошибок наделал, а никто меня носом не ткнул smile
(исправил уже).

А теперь по существу, рсскажите плиз что в этом логе такого страшного, и зачем вам откачиваться назад то?

вот код который я набросал и проверил :
Код

#!perl -w

use strict;


my %collection = ();

open (F, "<qmail.log");
while (<F>) {
    # убрал, чтоб самому потом не добавлять, при реальной обработке думаю понадобиться.
#    chomp;
    # выделяешь уникальность строки и заносишь в коллекцию
    if (/(new|info) msg (\d+)/) {
        push(@{$collection{$2}}, $_)
    # определяешь последняя ли это строчка в сообщении
    } elsif (/end msg (\d+)/) { 
    # дальше делаешь что-то с ообщением сохраненном в $collection($1)
        foreach(@{$collection{$1}}) { print "$1 === $_" }
        print "$1 === $_\n";
        # освобождаешь память
        delete $collection{$1};
    } else {
        # А здесь идет остальная обработка лога который не касается конкретных сообщений.
#        print
    }
}

Запусти его на своем логе, и посмотришь что мессаги идут в красивом таком порядке smile
Или объясни плиз логику своего приложения, а лучше код в студию.....


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
ZeeLax
Дата 11.9.2006, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 4388
Регистрация: 20.8.2006
Где: Алма-Ата

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



Цитата(Nab @  11.9.2006,  17:46 Найти цитируемый пост)
Или объясни плиз логику своего приложения, а лучше код в студию..... 

Да да, а этим нам будет намного проще разобраться.


--------------------
Utility is when you have one telephone, luxury is when you have two, opulence is when you have three — and paradise is when you have none.
— Doug Larson
PM MAIL WWW ICQ Skype Jabber   Вверх
Bulat
Дата 11.9.2006, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

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



Nab, вы по-моему совсем не читаете что я пишу вне тега code=perl и /code.

А вывело меня из себя лишь то что я сказал, что в один проход сделать очень сложно(и не факт. что будет оптимально), привел даже пару доводов, относительно отсутствия уникальности строки(или как принято называть уид), отсутствие уникального уида по сообщению, и информация об одном сообщении пишется не в одну а в нескольких строчках которые разбросаны по всему файлу. И знаешь я даже почти сделал в один проход, однако не получается. нет конечно можно запихивать в буфер одну за другим 10, 20..100....1000, строк но не думаю что это будет оптимально(хотя в реальности такого не будет), но мне нужно предусмотреть все возможные варианты.......
А товарищ ZeeLax, конечно спасибо за внимание, но смысл писать пост, который не имеет прямого отношения к моей проблеме?

Добавлено @ 15:18 
ZeeLax, мне нужно выдирать данные из этого лога персонально по каждому сообщению типа от кого, кому, объем, local/remote, доставлено или нет.
зачем вам код? достаточный кусок лога, если сможете написать акцентирую оптимальный(в смысле быстродействия, минимально используемого ресурса памяти - сервак слишком загружать тоже нельзя, не единственная задача- и т.п., кроме того не замудренный код, чтоб мог разобраться человек который будет после меня сидеть с этим) код обработки лога в один проход, я в подписи добавлю *** - бог.


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


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

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


 




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


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

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