Форум сайта python.su
0
Всем привет.
Задача состоит в следующем - есть огромный .txt файл (во время работы менять файл нельзя), который имеет такую структуру (если кому интересно - это данные по выданым кредитам):
куча текста с общей информацией
*Начало важного для меня блока*
Gutschrift спецкод1 дата1
все данные по кредиту1
Gutschrift спецкод2 дата2
все данные по кредиту2
…..
Gutschrift спецкодN датаN # N приблизительно равно 800
все данные по кредитуN
*Конец важного для меня блока*
куча текста с еще какой-то там информацией
Итак, моя задача состоит в следующем - нужно найти все числа от 5 до 10 цифр между “спецкодА” и следующим словом Gutschrift (это кредит по немецки) и выдать массив этих чисел.
Моя идея решения задачи состоит в том, что-бы считать весь файл в строку, из этой строки скопировать всё между “Gutschrift спецкодА” и следующим словом Gutschrift в новую строку и уже в ней найти все числа от 5 до 10 знаков при помощи регулярных выражений. Ну и при необходимости в цикле повторять это для разных спецкодов.
Вопрос к вам, уважаемое сообщество - является ли мой способ решения задачи оптимальным (ну или хотя-бы адекватным)? Если да, то каким образом можно из одной строки скопировать в другую только тот текст, который находится между спецкодом и следующим словом Gutschrift? (подозреваю, что тут не обойтись без регулярных выражений, но я могу ошибаться). Ну и на всякий случай третий вопрос - быть может, эту задачу вообще лучше решать при помощи другого языка и питон тут вообще не подходит?
Я старался описать задачу как можно более подробно, если у меня не получилось - спрашивайте, отвечу на любые вопросы и буду благодарен за любую помощь, а то я малость застрял с этой проблемой 
Отредактировано Chapla (Июль 24, 2018 10:55:30)
Офлайн
186
> есть огромный .txt файл
Каков примерный размер файла?
Офлайн
857
ChaplaНадо его перебирать построчно, пока не найдётся интересующая строка. Затем надо эту строку и последующие строки добавить в новый список, не включая туда строку с признаком завершения. Потом этот список взять и объединить в одну строку. Потом в полученном тексте выбирать числа через re.findall() с опцией re.DOTALL .
Моя идея решения задачи состоит в том, что-бы считать весь файл в строку, из этой строки скопировать всё между “Gutschrift спецкодА” и следующим словом Gutschrift в новую строку и уже в ней найти все числа от 5 до 10 знаков при помощи регулярных выражений. Ну и при необходимости в цикле повторять это для разных спецкодов.
Отредактировано py.user.next (Июль 24, 2018 12:30:01)
Офлайн
0
Rodegast
> есть огромный .txt файлКаков примерный размер файла?
py.user.next
Надо его перебирать построчно, пока не найдётся интересующая строка. Затем надо эту строку и последующие строки добавить в новый список, не включая туда строку с признаком завершения. Потом этот список взять и объединить в одну строку. Потом в полученном тексте выбирать числа через re.findall() с опцией re.DOTALL .
r"Gutschrift\W+" + Belegnummer
Офлайн
857
ChaplaТы должен выбрать весь блок сначала, в котором находятся нужные числа, а потом в этом блоке выбирать эти числа. То есть задача должна быть разделена на две - выделение блока для поиска и поиск чисел в выделенном блоке. Если же ты сразу будешь искать числа и выбирать их, то ты просто найдёшь числа не в том блоке.
Вполне вероятно, что слово Gutschrift будет в другой строке, то есть, между этим словом и спецкодом может быть несколько символов \n.
ChaplaТы просто не понял, про что речь. Строки берутся только для того, чтобы блок выделить, в котором будет проводиться поиск чисел.
Если перебирать построчно, то велика вероятность не найти ничего.
Отредактировано py.user.next (Июль 24, 2018 13:37:32)
Офлайн
0
py.user.nextНе совсем точно описал одну деталь, прошу прощения - спецкод встречается не единожды в тексте, он есть и в начале документа и в конце и я не уверен, сколько точно раз он там встречается. Так что единственным условием нахождения нужного блока, в котором я буду искать нужные числа - это Gutschrift\nспецкод, но я не знаю, сколько \n там будет (в качестве примера внизу есть скриншот. Выделенное число - это тот самый спецкод, что за числа идут после него - я без понятия).
Ты просто не понял, про что речь. Строки берутся только для того, чтобы блок выделить, в котором будет проводиться поиск чисел.
Отредактировано Chapla (Июль 24, 2018 14:15:29)
Прикреплённый файлы:
Untitled.png (7,4 KБ)
Офлайн
857
ChaplaВот ты пишешь, что код на одной строке с Gutschrift.
куча текста с общей информацией
*Начало важного для меня блока*
Gutschrift спецкод1 дата1
все данные по кредиту1
Gutschrift спецкод2 дата2
все данные по кредиту2
…..
Gutschrift спецкодN датаN # N приблизительно равно 800
все данные по кредитуN
*Конец важного для меня блока*
куча текста с еще какой-то там информацией
Отредактировано py.user.next (Июль 24, 2018 14:52:36)
Офлайн
ЕЯПП у тебя начало блока Gutschrift, конец блока - Belegnummer
типа так
>>> doc ='''Gutschrift 123 234 456 Belegnummer bla bla Gutschrift 123 234 4561 Belegnummer bla bla bla Gutschrift 123 234 456 Belegnummer bla bla bla ''' >>> tmp = [] >>> for line in doc.split('\n'): if 'Gutschrift' in line: tmp = [] elif 'Belegnummer' in line: print('\t'.join(tmp)) else: if line.strip(): tmp.append(line) 123 234 456 123 234 4561 123 234 456 >>>
Офлайн