|
Модераторы: ginnie, korob2001 |
|
AndreRoux |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 30.7.2012 Репутация: нет Всего: нет |
Добрый вечер всем.
При изучении Perl столкнулся со следующей проблемой: Есть файл x в него постоянно добавляется информация в таком виде: From [email protected] ...... ...... From [email protected] ...... ...... и т.д. Моя задача разбить этот файл на части, то есть чтобы каждая часть файла выглядела так: From [email protected] ...... ...... Но при разделении файла функцией split() выводятся только вхождения шаблона, я этому не удивляюсь ведь так и должно быть, но я уже 12 часов ломаю голову как разбить его на части, файл очень большой до 10Гб. Прошу помощи у коллег На данный момент код у меня записывает только строки From... а остальное складывает водну кучу(
Пожалуйста помогите решить проблему, некак не могу додуматься как это сделать. Из тем про парсинг примеры к сожалению не помогли Это сообщение отредактировал(а) AndreRoux - 31.7.2012, 00:55 |
|||
|
||||
Pfailed |
|
|||
Опытный Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 2 Всего: 39 |
Может быть так?
|
|||
|
||||
TP@MB@Y |
|
|||
Опытный Профиль Группа: Участник Сообщений: 370 Регистрация: 18.12.2004 Где: Москва Репутация: нет Всего: 4 |
Нужны уточнения:
1) "Файл нужно разбить на части" т.е. нужно создать много других файлов? 2) Что должно храниться в этих файлах? Например, исходный файл состоит только из этих строчек:
Что вы хотите получить на выходе? Это сообщение отредактировал(а) TP@MB@Y - 31.7.2012, 08:58 |
|||
|
||||
AndreRoux |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 30.7.2012 Репутация: нет Всего: нет |
Pfailed, большое вам спасибо вы помогли мне продвинуться дальше)
TP@MB@Y, да именно так, на выходе нужны файлы вот такого типа : From [email protected] ...... т.е. разбивать большой файл на маленькие от вхождения искомой строки до следующего вхождения искомой строки (т.е. следующее вхождение это уже файл2) Сейчас у меня код вот такой, да вроде бы все правильно но Perl не находит почему то совпадения в файле хоть они и есть, кстати когда я создаю тестовый файл с парочкой заголовков и сообщений совпадения находятся и создаются файлы для каждого сообщения, но когда я меняю адрес файла на настоящий совпадений как небывало(
Добавлено через 8 минут и 12 секунд В тестовом шаблоне вид вот такой:
В настоящем (большой файл) следующий (выведено два сообщения - разделить как и 1-м строка From...):
|
||||||
|
|||||||
TP@MB@Y |
|
|||
Опытный Профиль Группа: Участник Сообщений: 370 Регистрация: 18.12.2004 Где: Москва Репутация: нет Всего: 4 |
Уважаемый AndreRoux,
если вы хотите помощи, дайте ответ на мой вопрос:
|
|||
|
||||
AndreRoux |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 30.7.2012 Репутация: нет Всего: нет |
TP@MB@Y, Pfailed, большое вам спасибо за помощь!
Проблему решил так:
|
|||
|
||||
TP@MB@Y |
|
|||
Опытный Профиль Группа: Участник Сообщений: 370 Регистрация: 18.12.2004 Где: Москва Репутация: нет Всего: 4 |
AndreRoux, для начала нужно написать алгоритм, а потом его реализовывать (не важно уже на каком языке программирования - на перле, на паскале, на плюсах, на еще каком-нибудь питоне...)
изначально у вас не было четкого алгоритма, что и вызвало кучу вопросов. ну ладно, вы говорите, что разобрались и приводите тут свой код на перле. я так понял, вы 1) пробегаетесь по 10-ти гиговому файлу и собираете его содержимое (с группировкой по строчке с мейлом) в хэш %email.... 2) вы пробегаетесь циклом по отсортированному списку строчек с мейлом, опять парсите регуляркой строчку, выдирая имено мейл 3.1) если файл с соответствующим именем существует - открываете его на запись и пишете туда все что собрали по соотвествующему мейлу 3.2) если файл с соответствующим именем не существует - открываете его на запись и пишете туда все что собрали по соотвествующему мейлу жирным я выделил моменты, которые мне показались не очень удачными также не нашел отличий между пунктами 3.1 и 3.2 |
|||
|
||||
AndreRoux |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 30.7.2012 Репутация: нет Всего: нет |
3.1, 3.2 уже вырезал из программы. Ну файл не всегда такой большой он может быть и 50Кб
Ну что поделаешь, до этого была только теория из книжек кэмеэл и ламы с минимумом примеров, а тут сразу свалилась такая задача) Опыта еще нет. Если вы мне объясните некоторые принципы и ходы для этого примера да и вообще на будущее я вам буду очень благодарен Это сообщение отредактировал(а) AndreRoux - 31.7.2012, 12:42 |
|||
|
||||
TP@MB@Y |
|
|||
Опытный Профиль Группа: Участник Сообщений: 370 Регистрация: 18.12.2004 Где: Москва Репутация: нет Всего: 4 |
Возможности проверить код нет, но суть, я думаю понятна:
|
|||
|
||||
arto |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 1 Всего: 40 |
perl -lne 'BEGIN{ $/ = "\nFrom "; } $. == 1 && s#^From ##; my $a = (split "\\s+",$_,2)[0] or next; open F, ">> $a" and print F "From $_"' $MAIL
|
|||
|
||||
Правила форума "Perl: Системное программирование" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |