| # SPDX-License-Identifier: GPL-2.0+ |
| # vim: ts=2:sw=2:et:tw=80:nowrap |
| |
| import os, csv, glob |
| |
| class CSVCollection(dict): |
| delimiter=';' |
| quotechar='"' |
| source_column_name = 'Sources / Destinations' |
| |
| """ |
| This class is a dictionary representation of the collection of sheets that |
| exist in a given .ODS file. |
| """ |
| def __init__(self, pattern, skip_commented_lines=True, strip_lines=True): |
| super(CSVCollection, self).__init__() |
| self.pattern = pattern |
| C = '#' if skip_commented_lines else 'blahblahblah' |
| |
| if strip_lines: |
| strip = lambda s:s.strip() |
| else: |
| strip = lambda s:s |
| |
| # load all CSV files |
| key = self.source_column_name |
| for fname in glob.glob(pattern): |
| with open(fname) as F: |
| dR = csv.DictReader(F, delimiter=self.delimiter, |
| quotechar=self.quotechar) |
| name = os.path.basename(fname).partition('.')[0] |
| D = { |
| r[key]:{f:strip(c) for f,c in r.items() |
| if f != key and f[:1] not in ['', C] and |
| strip(c)[:1] not in ['', C]} |
| for r in dR if r[key][:1] not in ['', C] |
| } |
| # now, go back through and eliminate all empty dictionaries |
| D = {k:v for k,v in D.items() if v} |
| self[name] = D |