![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| zyxerr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 17.7.2008 Репутация: 2 Всего: 2 |
у меня есть файл IN.txt:
. текст текст КОМАНДА ЗНАЧЕНИЕ текст текст КОМАНДА ЗНАЧЕНИЕ текст . этот файл размером несколько гигабайт, всего более сотни видов команд. Необходимо создать скрипт, который: 1) проверяет правильное ли значение у конкретной команды 2) если значение неправильное, то поменять на значение по-умолчанию . Я создал файл SPEC.txt: . ПАТТЕРН КОМАНДЫ,ПАТТЕРН ЗНАЧЕНИЯ,ЗНАЧЕНИЕ ПО-УМОЛЧАНИЮ ПАТТЕРН КОМАНДЫ,ПАТТЕРН ЗНАЧЕНИЯ,ЗНАЧЕНИЕ ПО-УМОЛЧАНИЮ ПАТТЕРН КОМАНДЫ,ПАТТЕРН ЗНАЧЕНИЯ,ЗНАЧЕНИЕ ПО-УМОЛЧАНИЮ ПАТТЕРН КОМАНДЫ,ПАТТЕРН ЗНАЧЕНИЯ,ЗНАЧЕНИЕ ПО-УМОЛЧАНИЮ . в нем через запятую записан паттерн команды, паттерн значения и значение по-умолчанию. Теперь мне нужно, пробегая по каждой строке файла IN: 1) искать паттерн команды 2) проверять правильный ли паттерн значения 3) если неправильный, то поменять на значение по-умолчанию. . я немного не понимаю, как лучше это сделать? Занести в хеш данные из SPEC и потом сверять с хешем, или лучше в массив и потом перебирать по индексам массива. В файле SPEC 100 строк, в файле IN - несколько миллионов. Заранее спасибо за подсказку |
|||
|
||||
| IceSunrise |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 61 Регистрация: 7.4.2008 Где: Санкт-Петербург Репутация: 3 Всего: 3 |
Привет, zyxerr!
Если список команд и значений небольшой, то я не делал бы их шаблоны, а просто загнал бы все в трехуровневый хеш: Пример: команда_1->значение_1->значение_по_умолчанию_1 ->значение_2->значение_по_умолчанию_2 ... Если наборы значений для команд или наборы значений по умолчанию для значений пересекаются, то можно сделать независимые хеши с уникальными значениями и правильно расставить ссылки, это позволит съэкономить память. Пример: команда_1->значение_1->значение_по_умолчанию_1 ->значение_2->значение_по_умолчанию_2 команда_2->ссылка_на_значение_1 ->значение_3->ссылка_на_значение_по_умолчанию_2 ... Ну а если хочешь использовать шаблоны, то в качестве ключей хеша можно использовать рег.выраж, которые будут определять классы команд, значений и значений по умолчанию... Но тогда придется перебирать ключи, до обнаружения совпадения для перехода на следующий уровень... Первое, что пришло на ум Это сообщение отредактировал(а) IceSunrise - 30.10.2008, 17:48 |
|||
|
||||
| zyxerr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 17.7.2008 Репутация: 2 Всего: 2 |
Вечер добрый!
У каждой команды могут быть разные значения, но эти значения можно описать одним шаблоном. . пример: !NUM 235-П где: !NUM - команда 235-П - значение шаблоны: !NUM -шаблон команды (\d+)-?[ПпРрЗз]? - шаблон значения . по-умолчанию значение = "ОШИБКА" . в файле SPEC у меня записано: !NUM,(\d+)-?[ПпРрЗз]?,ОШИБКА . соответственно, если в тексте будет запись: !NUM 235x то оно не соответсвует шаблону значения и строка должна поменяться на !NUM ОШИБКА . Это сообщение отредактировал(а) zyxerr - 30.10.2008, 18:11 |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый zyxerr, если в SPEC.txt у Вас хранится шаблон команды, как Вы предполагаете использовать хэш?
Получается только массив. Массив массивов или хэшей - это как Вам удобнее, разница не столь значительна. Шаблоны в массиве лучше хранить в скомпилированном виде (через qr{}). -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| Itsys |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1338 Регистрация: 21.1.2008 Где: г. Москва Репутация: 2 Всего: 34 |
Как вариант, можно использовать три регулярки:
после этого
|
||||||
|
|||||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Itsys, какие достоинства этого варианта, кроме усложнения?
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| Itsys |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1338 Регистрация: 21.1.2008 Где: г. Москва Репутация: 2 Всего: 34 |
Надо проверить что будет работать быстрее, использование трех регулярок для всего файла или перебор по строкам...
|
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Itsys, как будем обрабатывать файл из нескольких миллионов строк? в память загрузим?
Регулярных выражений не 3, а 300. -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| Itsys |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1338 Регистрация: 21.1.2008 Где: г. Москва Репутация: 2 Всего: 34 |
ginnie, да, наверное лучше каждую из нескольких милионов строк проверять по 100 раз.....
ЗЫ А файл можно и в память загрузить.... все зависит от объема строки... если этот файл помещается на диске, и есть место куда можно свопиться..... не вижу никакой проблемы. Мы же не знаем всех параметров задачи (размер файла, мож там размер одной строки 10-20 байт) и конфигурации компьютера (сервера) на котором эта операция будет производиться. |
|||
|
||||
| zyxerr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 17.7.2008 Репутация: 2 Всего: 2 |
Условия такие:
. файл IN размером 1.5GB, длина строки - от 40 до 180 символов (стандарт - 75), всего - 26 млн строк команд - около сотни. Каждая команда начинается с со знака "!" в начале строки (!КОМАНДА) машина: Pentium E4600, 3 Gb оперативки, винчестер 320 GB |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
zyxerr, лучше еще добавить до поиска в строке команд по шаблону проверку на "!" для ускорения. Также, если много одинаковых команд, можно добавить кэширование уже обработанных комманд в хеше и сначала проверять по нему.
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| zyxerr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 17.7.2008 Репутация: 2 Всего: 2 |
ginnie,
да, я уже заметил, что если начала искать /^!/ а потом уточнять /команда/, то поиск в несколько раз быстрее проходит. А можешь подсказать:по оптимизации регулярных выражений кроме книги Фридла что еще можно посмотреть? какие-нибудь познавательные блоги, форумы? |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
zyxerr, по регулярным выражениям особо ничего подсказать не могу, для меня очень полезной оказалась глава "Поиск по шаблону" из книги Ларри Уолл, Том Кристиансен, Джон Орвант. Программирование на Perl. Еще очень полезно разобраться с отладочной информацией, которую выдает use re 'debug'.
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| zyxerr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 17.7.2008 Репутация: 2 Всего: 2 |
ginnie, спасибо
|
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |