Уведомления

Группа в Telegram: @pythonsu

#1 Июль 24, 2018 10:49:22

Chapla
Зарегистрирован: 2018-07-24
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Обрезание строки по шаблону

Всем привет.
Задача состоит в следующем - есть огромный .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)

Офлайн

#2 Июль 24, 2018 11:05:28

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Обрезание строки по шаблону

> есть огромный .txt файл

Каков примерный размер файла?



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#3 Июль 24, 2018 12:28:38

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Обрезание строки по шаблону

Chapla
Моя идея решения задачи состоит в том, что-бы считать весь файл в строку, из этой строки скопировать всё между “Gutschrift спецкодА” и следующим словом Gutschrift в новую строку и уже в ней найти все числа от 5 до 10 знаков при помощи регулярных выражений. Ну и при необходимости в цикле повторять это для разных спецкодов.
Надо его перебирать построчно, пока не найдётся интересующая строка. Затем надо эту строку и последующие строки добавить в новый список, не включая туда строку с признаком завершения. Потом этот список взять и объединить в одну строку. Потом в полученном тексте выбирать числа через re.findall() с опцией re.DOTALL .

А весь файл загонять в строку нельзя, так как он может стать больше со временем (5 гигабайт, например), а строка требует оперативную память под весь свой размер. Просто начнёт свопиться на диск и в конечном итоге всё повиснет, включая остальную часть системы.



Отредактировано py.user.next (Июль 24, 2018 12:30:01)

Офлайн

#4 Июль 24, 2018 13:15:23

Chapla
Зарегистрирован: 2018-07-24
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Обрезание строки по шаблону

Rodegast
> есть огромный .txt файлКаков примерный размер файла?

Размер файла 272Кб, возможно будет больше (или меньше)

py.user.next
Надо его перебирать построчно, пока не найдётся интересующая строка. Затем надо эту строку и последующие строки добавить в новый список, не включая туда строку с признаком завершения. Потом этот список взять и объединить в одну строку. Потом в полученном тексте выбирать числа через re.findall() с опцией re.DOTALL .

Вполне вероятно, что слово Gutschrift будет в другой строке, то есть, между этим словом и спецкодом может быть несколько символов \n. Пока-что я искал нужное место при помощи регулярного выражения:
 r"Gutschrift\W+" + Belegnummer 
Если перебирать построчно, то велика вероятность не найти ничего.

Офлайн

#5 Июль 24, 2018 13:36:37

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Обрезание строки по шаблону

Chapla
Вполне вероятно, что слово Gutschrift будет в другой строке, то есть, между этим словом и спецкодом может быть несколько символов \n.
Ты должен выбрать весь блок сначала, в котором находятся нужные числа, а потом в этом блоке выбирать эти числа. То есть задача должна быть разделена на две - выделение блока для поиска и поиск чисел в выделенном блоке. Если же ты сразу будешь искать числа и выбирать их, то ты просто найдёшь числа не в том блоке.

Chapla
Если перебирать построчно, то велика вероятность не найти ничего.
Ты просто не понял, про что речь. Строки берутся только для того, чтобы блок выделить, в котором будет проводиться поиск чисел.



Отредактировано py.user.next (Июль 24, 2018 13:37:32)

Офлайн

#6 Июль 24, 2018 14:14:46

Chapla
Зарегистрирован: 2018-07-24
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Обрезание строки по шаблону

py.user.next
Ты просто не понял, про что речь. Строки берутся только для того, чтобы блок выделить, в котором будет проводиться поиск чисел.
Не совсем точно описал одну деталь, прошу прощения - спецкод встречается не единожды в тексте, он есть и в начале документа и в конце и я не уверен, сколько точно раз он там встречается. Так что единственным условием нахождения нужного блока, в котором я буду искать нужные числа - это Gutschrift\nспецкод, но я не знаю, сколько \n там будет (в качестве примера внизу есть скриншот. Выделенное число - это тот самый спецкод, что за числа идут после него - я без понятия).
Именно в этом вопрос - как найти начало и конец блока, используя построчный перебор?

Отредактировано Chapla (Июль 24, 2018 14:15:29)

Прикреплённый файлы:
attachment Untitled.png (7,4 KБ)

Офлайн

#7 Июль 24, 2018 14:52:05

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Обрезание строки по шаблону

Chapla
куча текста с общей информацией
*Начало важного для меня блока*
Gutschrift спецкод1 дата1
все данные по кредиту1
Gutschrift спецкод2 дата2
все данные по кредиту2
…..
Gutschrift спецкодN датаN # N приблизительно равно 800
все данные по кредитуN
*Конец важного для меня блока*
куча текста с еще какой-то там информацией
Вот ты пишешь, что код на одной строке с Gutschrift.

Сформируй небольшой файл для примера, заполни его любыми кодами и числами и пришли сюда. Дальше напиши, какой блок из него тебе нужен и как этот блок ограничен сверху и снизу (как ты сам понимаешь, где он начинается и где заканчивается). Потом напиши, какие числа достать из него.

То есть напиши, какой именно входной файл обрабатывается (можно выдумать). Какой именно результат должен получиться из этого входного файла (какой файл с числами).



Отредактировано py.user.next (Июль 24, 2018 14:52:36)

Офлайн

#8 Июль 24, 2018 15:21:14

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Обрезание строки по шаблону

ЕЯПП у тебя начало блока 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
>>> 

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version