Iterate over the compound entries in the given file

def parse_compound_file(f, context=None):
    """Iterate over the compound entries in the given file"""

    f.readline()  # Skip header
    for lineno, row in enumerate(csv.reader(f, delimiter='\t')):
        compound_id, names, formula = row[:3]
        names = (decode_name(name) for name in names.split(',<br>'))

        # ModelSEED sometimes uses an asterisk and number at
        # the end of formulas. This seems to have a similar
        # meaning as '(...)n'.
        m = re.match(r'^(.*)\*(\d*)$', formula)
        if m is not None:
            if m.group(2) != '':
                formula = '({}){}'.format(m.group(1), m.group(2))
            else:
                formula = '({})n'.format(m.group(1))

        formula = formula.strip()
        if formula == '' or formula == 'noformula':
            formula = None

        mark = FileMark(context, lineno, 0)
        yield CompoundEntry(compound_id, names, formula, filemark=mark)