From b85d120ad22db56e1af9a5a427f2743c9040284f Mon Sep 17 00:00:00 2001 From: helmutm Date: Mon, 10 May 2010 12:09:54 +0000 Subject: [PATCH] allow for more than one key per CSV column git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@3861 fd906abe-77d9-0310-91a1-e0d9ade77398 --- external/dsv.py | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/external/dsv.py b/external/dsv.py index 6b23c55..c3138c1 100644 --- a/external/dsv.py +++ b/external/dsv.py @@ -57,24 +57,27 @@ class CsvReader(BaseReader): continue currentElements = {} for k, v in row.items(): - k, v = self.preprocessField(k, v) - if k is None: + keys, v = self.preprocessField(k, v) + if not keys: continue - type = None - if '.' in k: - type, k = k.split('.', 1) - element = currentElements.get(type) - if element is None: - ef = self.elementFactories.get(type) - if ef is None: - raise ValueError('Missing element factory for %r.' % type) - if ef == 'ignore': - continue - element = currentElements[type] = ef() - element.type = type - if isinstance(v, str): - v = v.decode(self.encoding) - element[k] = v + if not isinstance(keys, (tuple, list)): + keys = [keys] + for k in keys: + type = None + if '.' in k: + type, k = k.split('.', 1) + element = currentElements.get(type) + if element is None: + ef = self.elementFactories.get(type) + if ef is None: + raise ValueError('Missing element factory for %r.' % type) + if ef == 'ignore': + continue + element = currentElements[type] = ef() + element.type = type + if isinstance(v, str): + v = v.decode(self.encoding) + self.setValue(element, k, v) for element in sorted(currentElements.values(), key=lambda x: x.order): if element.identifier is None: result.append(element) @@ -94,6 +97,9 @@ class CsvReader(BaseReader): def preprocessField(self, k, v): return k, v + def setValue(self, element, k, v): + element[k] = v + def getDate(self, value, correctBug=False): if not value: return value