The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Навигация в текстовом файле, !*! AndyTacker, 10-Июн-11, 20:46  [смотреть все]
Пишу пакетный обработчик больших текстовых файлов (более Гб)

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

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

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

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

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

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


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

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

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

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

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

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

    • Навигация в текстовом файле, !*! AndyTacker, 14:07 , 14-Июн-11 (4)
      спасибо за идею..

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

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

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

      • Навигация в текстовом файле, !*! ACCA, 18:34 , 16-Июн-11 (7)
        > вывести 10-ую и 15-ую строку после ключа, но между ними может встречаться
        > ключ (то есть анализ ключа нельзя прерывать)

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

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

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

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




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

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