LINUX.ORG.RU

разбор файла с метками

 


0

1

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

Т е что-то типа такого в вариантах:

str1 B
str2
str3 E
str4

str1
str2
str3 E
str4

Што? Ничего не понятно. Тип тебе нужно считать все строки между B и E. При этом по умолчанию, метка B находится в начале файла, а E в конце. Так?

Aswed ★★★★★
()
Ответ на: комментарий от Aswed

При этом по умолчанию, метка B находится в начале файла, а E в конц

Необязательно - метка конца может находится в середине БЕЗ метки начала ( ну или наоборт - метка начала может наъодится в середине а метки конца нет)

Jopich1
() автор топика

http://kaitai.io/

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

anonymous
()

Тебе нужно:

A1 | A1   | A1   | A1
A2 | B1 B | A2   | B1 B
A3 | B2   | A3   | B2
A4 | B3   | A4 E | B3 E
A5 | B4   | B1   | C1
где Ax Bx Cx строки с разными идентификаторами

или:
A1 | XX   | A1   | XX
A2 | A1 B | A2   | A1 B
A3 | A2   | A3   | A2
A4 | A3   | A4 E | A3 E
A5 | A4   | XX   | XX
где Ax строки с нужными идентификаторами
а XX нафиг ненужные строки

Столбцы это просто возможные варианты.

anonymous
()
B_label = 'B'
E_label = 'E'

strings = open('file.txt').readlines()
B = 0
E = len(strings)

for i,l in enumerate(strings):
    if B_label in l: B = i
    if E_label in l: E = i + 1

print(''.join(strings[B:E]))
anonymous
()
Ответ на: комментарий от Jopich1

Чем это отличается от того что я сказал?

Aswed ★★★★★
()

Ты говоришь чертовски непонятно, но, возможно, тебе нужно это.

NO_BEGIN    = 0
BEGIN_FOUND = 1

def read_labels(path, begin, end):
	state = NO_BEGIN
	acc = []
	with open(path, 'rt') as header:
		for line in header:
			if line[-1] == '\n':
				line = line[:-1]
			split = line.split(' ')
			data = split[0]
			if len(split) > 1:
				label = split[1]
				if state == NO_BEGIN:
					if label == begin:
						state = BEGIN_FOUND
						acc = []
				acc.append(data)
				if label == end:
					break
			else:
				acc.append(data)
	return acc

Aswed ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.