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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вложенные скобки? 
:(
    Опции темы
JavaCraft
Дата 8.11.2010, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Интересует общий принцип работы с повторяющимися структурами данных. Например, многострочными логами.
Допустим, дан файл 10Гб с повторяющейся структурой:

structname {
  field1 = v1
  field2 = v2
  field3 = v3
  ...
}

Читаем из него очередной кусок текста 2M в буфер $buf
Применяем один раз регулярку, которая выполняет разбор этого буфера
Обрабатываем готовый результат в цикле:
...
foo($buf);
...
sub foo{
 ?
 $rec_list = shift _
 ?
 foreach $rec (?){
   в $rec должен быть кортеж (v1,v2,v3 ...)
   передаем кортеж в другую функцию для асинхронной вставки в базу данных.
 }
}

1) Как реализовать такую регулярку?
2) Если это не оптимально, каков оптимальный алгоритм разбора таких логов на Perl?

Это сообщение отредактировал(а) JavaCraft - 8.11.2010, 14:34
PM MAIL   Вверх
DurRandir
Дата 8.11.2010, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вы даже примера кусочка лога не дали, а уже хотите регулярку, которая бы его разбирала.
PM   Вверх
JavaCraft
Дата 8.11.2010, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Почему не дал? От переименования смысл не меняется.


начало буфера - обрыв структуры
"
object {
  id = 123
  name = Смартфон1
  cost = 123
  note = Почти новый
}

object {
  id = 124
  name = Смартфон2
  cost = 1234
  note = Новый новый,
новее не бывает
}

object {
  id = 125
  name = Смартфон3
  cost = 12
  note = серый, китайский,
с очень узким дисплеем
}

object {
 id "обрыв структуры


Это сообщение отредактировал(а) JavaCraft - 9.11.2010, 14:33
PM MAIL   Вверх
ming
Дата 12.11.2010, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



непонятно зачем читать кусками по 10М, почему нельзя читать поэлементно?

Код

use strict;

read_log();

sub read_log {
    local $/ = "}";  # читать не построчно, а блоками, оканчивающимися символом }

    while(<DATA>) {    
        if (/(.+?){\s*id =(.+?)name =(.+?)cost =(.+?)note =(.+?)}/s) 
        {        
            my ($struct, $id, $name, $cost, $note) = map { trim($_) } ($1,$2,$3,$4,$5);        
            db_insert( [ $struct, $id, $name, $cost, $note ] );
        }    
    }
}

sub db_insert {    
    my $tuple = shift;
    print "Inserting " . join ', ', @$tuple;
    print "\n";
}

sub trim {
    my $str = shift;    
    $str =~ s/^\s+//;
    $str =~ s/\s+$//;
    return $str;
}

__DATA__
object {
  id = 123
  name = Смартфон1
  cost = 123
  note = Почти новый
}

object {
  id = 124
  name = Смартфон2
  cost = 1234
  note = Новый новый,
новее не бывает
}

object {
  id = 125
  name = Смартфон3
  cost = 12
  note = серый, китайский,
с очень узким дисплеем
}


Это сообщение отредактировал(а) ming - 12.11.2010, 18:21
PM MAIL ICQ Jabber   Вверх
Logo
Дата 16.11.2010, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А где вложенные скобки?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




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


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

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