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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как сделать хеш из трех переменных? или тут вообще хеш не нужен 
:(
    Опции темы
zyxerr
Дата 30.10.2008, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



у меня есть файл IN.txt:
.
текст
текст
КОМАНДА ЗНАЧЕНИЕ
текст
текст
КОМАНДА ЗНАЧЕНИЕ
текст
.
этот файл размером несколько гигабайт, всего более сотни видов команд. Необходимо создать скрипт, который:
1) проверяет правильное ли значение у конкретной команды
2) если значение неправильное, то поменять на значение по-умолчанию
.
Я создал файл SPEC.txt:
.
ПАТТЕРН КОМАНДЫ,ПАТТЕРН ЗНАЧЕНИЯ,ЗНАЧЕНИЕ ПО-УМОЛЧАНИЮ
ПАТТЕРН КОМАНДЫ,ПАТТЕРН ЗНАЧЕНИЯ,ЗНАЧЕНИЕ ПО-УМОЛЧАНИЮ
ПАТТЕРН КОМАНДЫ,ПАТТЕРН ЗНАЧЕНИЯ,ЗНАЧЕНИЕ ПО-УМОЛЧАНИЮ
ПАТТЕРН КОМАНДЫ,ПАТТЕРН ЗНАЧЕНИЯ,ЗНАЧЕНИЕ ПО-УМОЛЧАНИЮ
.
в нем через запятую записан паттерн команды, паттерн значения и значение по-умолчанию.
Теперь мне нужно, пробегая по каждой строке файла IN:
1) искать паттерн команды
2) проверять правильный ли паттерн значения
3) если неправильный, то поменять на значение по-умолчанию.
.
я немного не понимаю, как лучше это сделать? Занести в хеш данные из SPEC и потом сверять с хешем, или лучше в массив и потом перебирать по индексам массива. В файле SPEC 100 строк, в файле IN - несколько миллионов. Заранее спасибо за подсказку

PM MAIL   Вверх
IceSunrise
Дата 30.10.2008, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Привет, zyxerr!

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

Пример:
команда_1->значение_1->значение_по_умолчанию_1
                 ->значение_2->значение_по_умолчанию_2
...

Если наборы значений для команд или наборы значений по умолчанию для значений пересекаются, то можно сделать независимые хеши с уникальными значениями и правильно расставить ссылки, это позволит съэкономить память.

Пример:
команда_1->значение_1->значение_по_умолчанию_1
                 ->значение_2->значение_по_умолчанию_2

команда_2->ссылка_на_значение_1
                  ->значение_3->ссылка_на_значение_по_умолчанию_2
...


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

Первое, что пришло на ум smile

Это сообщение отредактировал(а) IceSunrise - 30.10.2008, 17:48
PM MAIL   Вверх
zyxerr
Дата 30.10.2008, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вечер добрый!

У каждой команды могут быть разные значения, но эти значения можно описать одним шаблоном.
.
пример:
!NUM 235-П
где:
!NUM - команда
235-П - значение
шаблоны:
!NUM  -шаблон команды
(\d+)-?[ПпРрЗз]? - шаблон значения
.
по-умолчанию значение = "ОШИБКА"
.
в файле SPEC у меня записано:
!NUM,(\d+)-?[ПпРрЗз]?,ОШИБКА
.
соответственно, если в тексте будет запись:
!NUM 235x
то оно не соответсвует шаблону значения и строка должна поменяться на
!NUM ОШИБКА
.


Это сообщение отредактировал(а) zyxerr - 30.10.2008, 18:11
PM MAIL   Вверх
ginnie
Дата 30.10.2008, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Уважаемый zyxerr, если в SPEC.txt у Вас хранится шаблон команды, как Вы предполагаете использовать хэш?
Получается только массив. Массив массивов или хэшей - это как Вам удобнее, разница не столь значительна. Шаблоны в массиве лучше хранить в скомпилированном виде (через qr{}).


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Itsys
Дата 30.10.2008, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

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



Как вариант, можно использовать три регулярки:
Код

s/^\!(NUM\s(\d+)-?[ПпРрЗз]?)$/+$1/g

после этого
Код

s/^!NUM\s(.*)$/!NUM\sОШИБКА/g

Код

s/^\+(NUM\s(\d+)-?[ПпРрЗз]?)$/!$1/g

PM MAIL WWW Skype   Вверх
ginnie
Дата 30.10.2008, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Itsys, какие достоинства этого варианта, кроме усложнения?  smile 


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Itsys
Дата 30.10.2008, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

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



Надо проверить что будет работать быстрее, использование трех регулярок для всего файла или перебор по строкам...
PM MAIL WWW Skype   Вверх
ginnie
Дата 30.10.2008, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Itsys, как будем обрабатывать файл из нескольких миллионов строк? в память загрузим?
Регулярных выражений не 3, а 300.  smile 


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Itsys
Дата 31.10.2008, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

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



ginnie, да, наверное лучше каждую из нескольких милионов строк проверять по 100 раз.....  smile 

ЗЫ А файл можно и в память загрузить.... все зависит от объема строки... если этот файл помещается на диске, и есть место куда можно свопиться..... не вижу никакой проблемы. Мы же не знаем всех параметров задачи (размер файла, мож там размер одной строки 10-20 байт) и конфигурации компьютера (сервера) на котором эта операция будет производиться.
PM MAIL WWW Skype   Вверх
zyxerr
Дата 31.10.2008, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Условия такие: 
.
файл IN размером 1.5GB, длина строки - от 40 до 180 символов (стандарт - 75), всего - 26 млн строк
команд - около сотни. Каждая команда начинается с со знака "!" в начале строки (!КОМАНДА)
машина: Pentium E4600, 3 Gb оперативки, винчестер 320 GB




PM MAIL   Вверх
ginnie
Дата 31.10.2008, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



zyxerr, лучше еще добавить до поиска в строке команд по шаблону проверку на "!" для ускорения. Также, если много одинаковых команд, можно добавить кэширование уже обработанных комманд в хеше и сначала проверять по нему.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
zyxerr
Дата 31.10.2008, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ginnie, 
да, я уже заметил, что если начала искать /^!/ а потом уточнять /команда/, то поиск в несколько раз быстрее проходит. А можешь подсказать:по оптимизации регулярных выражений кроме книги Фридла что еще можно посмотреть? какие-нибудь познавательные блоги, форумы?
PM MAIL   Вверх
ginnie
Дата 31.10.2008, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



zyxerr, по регулярным выражениям особо ничего подсказать не могу, для меня очень полезной оказалась глава "Поиск по шаблону" из книги Ларри Уолл, Том Кристиансен, Джон Орвант. Программирование на Perl. Еще очень полезно разобраться с отладочной информацией, которую выдает use re 'debug'.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
zyxerr
Дата 31.10.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


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

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


 




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


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

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