| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Системное программирование > Разбить файл на части по вхождению строки |
| Автор: AndreRoux 30.7.2012, 22:57 | ||
| Добрый вечер всем. При изучении Perl столкнулся со следующей проблемой: Есть файл x в него постоянно добавляется информация в таком виде: From email@email.domian ...... ...... From email1@email1.domian ...... ...... и т.д. Моя задача разбить этот файл на части, то есть чтобы каждая часть файла выглядела так: From email@email.domian ...... ...... Но при разделении файла функцией split() выводятся только вхождения шаблона, я этому не удивляюсь ведь так и должно быть, но я уже 12 часов ломаю голову как разбить его на части, файл очень большой до 10Гб. Прошу помощи у коллег На данный момент код у меня записывает только строки From... а остальное складывает водну кучу(
Пожалуйста помогите решить проблему, некак не могу додуматься как это сделать. Из тем про парсинг примеры к сожалению не помогли |
| Автор: Pfailed 31.7.2012, 08:17 | ||
Может быть так?
|
| Автор: TP@MB@Y 31.7.2012, 08:57 | ||
| Нужны уточнения: 1) "Файл нужно разбить на части" т.е. нужно создать много других файлов? 2) Что должно храниться в этих файлах? Например, исходный файл состоит только из этих строчек:
Что вы хотите получить на выходе? |
| Автор: AndreRoux 31.7.2012, 10:02 | ||||||
| Pfailed, большое вам спасибо вы помогли мне продвинуться дальше) TP@MB@Y, да именно так, на выходе нужны файлы вот такого типа : From email@email.domian ...... т.е. разбивать большой файл на маленькие от вхождения искомой строки до следующего вхождения искомой строки (т.е. следующее вхождение это уже файл2) Сейчас у меня код вот такой, да вроде бы все правильно но Perl не находит почему то совпадения в файле хоть они и есть, кстати когда я создаю тестовый файл с парочкой заголовков и сообщений совпадения находятся и создаются файлы для каждого сообщения, но когда я меняю адрес файла на настоящий совпадений как небывало(
Добавлено через 8 минут и 12 секунд В тестовом шаблоне вид вот такой:
В настоящем (большой файл) следующий (выведено два сообщения - разделить как и 1-м строка From...):
|
| Автор: AndreRoux 31.7.2012, 11:11 | ||
| TP@MB@Y, Pfailed, большое вам спасибо за помощь! Проблему решил так:
|
| Автор: TP@MB@Y 31.7.2012, 11:43 |
| AndreRoux, для начала нужно написать алгоритм, а потом его реализовывать (не важно уже на каком языке программирования - на перле, на паскале, на плюсах, на еще каком-нибудь питоне...) изначально у вас не было четкого алгоритма, что и вызвало кучу вопросов. ну ладно, вы говорите, что разобрались и приводите тут свой код на перле. я так понял, вы 1) пробегаетесь по 10-ти гиговому файлу и собираете его содержимое (с группировкой по строчке с мейлом) в хэш %email.... 2) вы пробегаетесь циклом по отсортированному списку строчек с мейлом, опять парсите регуляркой строчку, выдирая имено мейл 3.1) если файл с соответствующим именем существует - открываете его на запись и пишете туда все что собрали по соотвествующему мейлу 3.2) если файл с соответствующим именем не существует - открываете его на запись и пишете туда все что собрали по соотвествующему мейлу жирным я выделил моменты, которые мне показались не очень удачными также не нашел отличий между пунктами 3.1 и 3.2 |
| Автор: AndreRoux 31.7.2012, 12:38 |
| 3.1, 3.2 уже вырезал из программы. Ну файл не всегда такой большой он может быть и 50Кб Ну что поделаешь, до этого была только теория из книжек кэмеэл и ламы с минимумом примеров, а тут сразу свалилась такая задача) Опыта еще нет. Если вы мне объясните некоторые принципы и ходы для этого примера да и вообще на будущее я вам буду очень благодарен |
| Автор: TP@MB@Y 31.7.2012, 15:02 | ||
Возможности проверить код нет, но суть, я думаю понятна:
|
| Автор: arto 1.8.2012, 09:43 |
| perl -lne 'BEGIN{ $/ = "\nFrom "; } $. == 1 && s#^From ##; my $a = (split "\\s+",$_,2)[0] or next; open F, ">> $a" and print F "From $_"' $MAIL |