68 lines
1.7 KiB
Python
68 lines
1.7 KiB
Python
import sys
|
|
import csv
|
|
|
|
def next_l(it):
|
|
n = next(it)
|
|
while not n.strip():
|
|
n = next(it)
|
|
return n.strip()
|
|
|
|
def next_s(it):
|
|
n = next(it)
|
|
return n.strip()
|
|
|
|
def parse_bit(s):
|
|
if ':' in s:
|
|
a, b = s.split(':')
|
|
return int(a, 10), int(b, 10)
|
|
else:
|
|
return int(s, 10)
|
|
|
|
def parse(lines):
|
|
it = iter(lines)
|
|
|
|
while True:
|
|
try:
|
|
name = next_l(it)
|
|
assert name not in {'Bit', 'Description'}
|
|
except StopIteration:
|
|
return
|
|
n = next_l(it)
|
|
assert n == 'Bit', n
|
|
bits = []
|
|
n = next_s(it)
|
|
while n != 'Description' and n != 'Name':
|
|
bits.append(parse_bit(n))
|
|
n = next_s(it)
|
|
names = []
|
|
if n == 'Name':
|
|
n = next_s(it)
|
|
while n != 'Description':
|
|
names.append(n)
|
|
n = next_s(it)
|
|
assert n == 'Description'
|
|
descriptions = []
|
|
n = next_s(it)
|
|
while n != '':
|
|
descriptions.append(n)
|
|
n = next_s(it)
|
|
assert len(descriptions) == len(bits), (descriptions, bits)
|
|
if names:
|
|
assert len(names) == len(bits), (names, bits)
|
|
yield name, bits, names, descriptions
|
|
|
|
def generate_csv(parsed):
|
|
with open(sys.argv[2], 'w', newline='') as f:
|
|
writer = csv.writer(f)
|
|
for name, bits, _, descriptions in parsed:
|
|
for bit, description in zip(bits, descriptions):
|
|
bits = str(bit) if type(bit) is int else ':'.join(map(str, bit))
|
|
writer.writerow([name, bits, description])
|
|
writer.writerow([])
|
|
|
|
with open(sys.argv[1], 'r') as f:
|
|
buf = f.read()
|
|
lines = buf.split('\n')
|
|
#list(parse(lines))
|
|
generate_csv(parse(lines))
|