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
This commit is contained in:
helmutm 2010-05-10 12:09:54 +00:00
parent 68fe787feb
commit b85d120ad2

40
external/dsv.py vendored
View file

@ -57,24 +57,27 @@ class CsvReader(BaseReader):
continue continue
currentElements = {} currentElements = {}
for k, v in row.items(): for k, v in row.items():
k, v = self.preprocessField(k, v) keys, v = self.preprocessField(k, v)
if k is None: if not keys:
continue continue
type = None if not isinstance(keys, (tuple, list)):
if '.' in k: keys = [keys]
type, k = k.split('.', 1) for k in keys:
element = currentElements.get(type) type = None
if element is None: if '.' in k:
ef = self.elementFactories.get(type) type, k = k.split('.', 1)
if ef is None: element = currentElements.get(type)
raise ValueError('Missing element factory for %r.' % type) if element is None:
if ef == 'ignore': ef = self.elementFactories.get(type)
continue if ef is None:
element = currentElements[type] = ef() raise ValueError('Missing element factory for %r.' % type)
element.type = type if ef == 'ignore':
if isinstance(v, str): continue
v = v.decode(self.encoding) element = currentElements[type] = ef()
element[k] = v 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): for element in sorted(currentElements.values(), key=lambda x: x.order):
if element.identifier is None: if element.identifier is None:
result.append(element) result.append(element)
@ -94,6 +97,9 @@ class CsvReader(BaseReader):
def preprocessField(self, k, v): def preprocessField(self, k, v):
return k, v return k, v
def setValue(self, element, k, v):
element[k] = v
def getDate(self, value, correctBug=False): def getDate(self, value, correctBug=False):
if not value: if not value:
return value return value