The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Навигация в текстовом файле"
Вариант для распечатки  
Пред. тема | След. тема 
Форум WEB технологии (Perl)
Изначальное сообщение [ Отслеживать ]

"Навигация в текстовом файле"  +/
Сообщение от AndyTacker (ok) on 10-Июн-11, 20:46 
Пишу пакетный обработчик больших текстовых файлов (более Гб)

Как реализовать следующие инструкции:

1) Напечатать все строки, которые на 10 выше искомой и на 5 строк ниже. (находим строку удовлетворяющую критерию поиска (ключевую) и печатаем две строки: выше на 10 строк и ниже на 5, и так для всех ключевых строк.

2) Найти строку по ключу, провести поиск вверх по другому ключу и напечатать найденную строку. И так для всех ключевых строк.

Заранее спасибо за ответ, или хотя направление где искать.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Навигация в текстовом файле"  +1 +/
Сообщение от ACCA (ok) on 12-Июн-11, 01:01 
> Пишу пакетный обработчик больших текстовых файлов (более Гб)

По нынешним временам - ни фига не большой. Засоси в массив по строке на элемент массива и играйся.


Кошерно тоже можно, только ненужной возни больше.

> 1) Напечатать все строки, которые на 10 выше искомой и на 5

Сделай кольцевой буфер на 16 элементов. Набей строками. Потом проверь 11-й элемент. Если совпало, забирай первый и последний. Можешь взять RingBuffer с CPAN, можешь сам написать - штука достаточно тривиальная.

Если совсем лень возиться - набивай строки в список с помощью push, выбрасывай с помощью shift, всё время проверяя 11-й элемент:

for (my $i=0; $i< 15; $i++) {
    push @buff, scalar(<>);
}

while (<>) {
    push @buff, $_;
    if ($buff[10] =~ /regexp/) {
        print @buff[0,10,15];
        ... other stuff ...
    }
    shift @buf;
}

> 2) Найти строку по ключу, провести поиск вверх по другому ключу и
> напечатать найденную строку. И так для всех ключевых строк.

Я бы это за два прохода сделал. Сначала сделал индекс первых ключей - где сидят и кто у них второй ключ, за второй проход нашёл ближайшие вторые ключи и вывел их.

Если ключей ожидается больше, чем доступной памяти, используй Tie::File или DBM.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "Навигация в текстовом файле"  +/
Сообщение от AndyTacker (ok) on 14-Июн-11, 14:04 
спасибо за развернутый ответ.. хотя не совсем то, что искал, но помогло продвинуться в проекте..

а что такое DBM?

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

6. "Навигация в текстовом файле"  +/
Сообщение от ACCA (ok) on 16-Июн-11, 18:31 
> а что такое DBM?

Спроси у гугла perldoc dbm

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

2. "Навигация в текстовом файле"  +/
Сообщение от cryo (ok) on 14-Июн-11, 11:58 
> 1) Напечатать все строки, которые на 10 выше искомой и на 5
> строк ниже. (находим строку удовлетворяющую критерию поиска (ключевую) и печатаем две
> строки: выше на 10 строк и ниже на 5, и так
> для всех ключевых строк.

По первому добавить нечего, кольцевой буфер - вполне.

> 2) Найти строку по ключу, провести поиск вверх по другому ключу и
> напечатать найденную строку. И так для всех ключевых строк.

Ищи сразу оба ключа, строку с последним найденным вторым ключом сохраняй.
Встретил первый ключ - вывел сохраненную строку со вторым ключом.
Один проход.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

4. "Навигация в текстовом файле"  +/
Сообщение от AndyTacker (ok) on 14-Июн-11, 14:07 
спасибо за идею..

вот бы еще что-нить придумать с последующими строками..

просто задача часто такая:

вывести 10-ую и 15-ую строку после ключа, но между ними может встречаться ключ (то есть анализ ключа нельзя прерывать)

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

7. "Навигация в текстовом файле"  +/
Сообщение от ACCA (ok) on 16-Июн-11, 18:34 
> вывести 10-ую и 15-ую строку после ключа, но между ними может встречаться
> ключ (то есть анализ ключа нельзя прерывать)

Продолжай поиск - ты же не потерял строки между 10-ой и 15-ой. На одном из следующих шагов строка с ключом окажется 11-ой и regexp её увидит.

Ты код примера пробовал запускать?

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

5. "Навигация в текстовом файле"  +/
Сообщение от ACCA (ok) on 16-Июн-11, 18:30 
>> 2) Найти строку по ключу, провести поиск вверх по другому ключу и
>> напечатать найденную строку. И так для всех ключевых строк.
> Ищи сразу оба ключа, строку с последним найденным вторым ключом сохраняй.
> Встретил первый ключ - вывел сохраненную строку со вторым ключом.
> Один проход.

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

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру