Найти - Пользователи
Полная версия: Обрезание строки по шаблону
Начало » Python для новичков » Обрезание строки по шаблону
1
Chapla
Всем привет.
Задача состоит в следующем - есть огромный .txt файл (во время работы менять файл нельзя), который имеет такую структуру (если кому интересно - это данные по выданым кредитам):

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

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

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

Я старался описать задачу как можно более подробно, если у меня не получилось - спрашивайте, отвечу на любые вопросы и буду благодарен за любую помощь, а то я малость застрял с этой проблемой
Rodegast
> есть огромный .txt файл

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

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

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

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

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

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

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

То есть напиши, какой именно входной файл обрабатывается (можно выдумать). Какой именно результат должен получиться из этого входного файла (какой файл с числами).
vic57
ЕЯПП у тебя начало блока 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
>>> 
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB