improvements for reader and loader implementations
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@3817 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
5b538e3753
commit
0cf8f4846e
2 changed files with 29 additions and 6 deletions
14
external/base.py
vendored
14
external/base.py
vendored
|
@ -55,15 +55,15 @@ class BaseLoader(object):
|
|||
self.logger = getLogger('Loader')
|
||||
self.groups = {}
|
||||
|
||||
def load(self, elements):
|
||||
self.loadRecursive(elements)
|
||||
def load(self, elements, recur=True):
|
||||
self.loadRecursive(elements, recur)
|
||||
self.transcript.write('Rows loaded: %(count)i; changes: %(changed)i; '
|
||||
'errors: %(errors)i\n' % self.summary)
|
||||
|
||||
def loadRecursive(self, elements):
|
||||
def loadRecursive(self, elements, recur=True):
|
||||
for element in elements:
|
||||
element.execute(self)
|
||||
if element.subElements is not None:
|
||||
if recur and element.subElements is not None:
|
||||
self.loadRecursive(element.subElements)
|
||||
self.summary['count'] += 1
|
||||
|
||||
|
@ -73,6 +73,12 @@ class BaseLoader(object):
|
|||
self.summary['errors'] += 1
|
||||
self.logger.error(message)
|
||||
|
||||
def warn(self, message):
|
||||
self.transcript.write(message + '\n')
|
||||
self.errors.append(message)
|
||||
self.summary['warnings'] += 1
|
||||
self.logger.warn(message)
|
||||
|
||||
def change(self, message=None):
|
||||
if message is not None:
|
||||
self.transcript.write(message + '\n')
|
||||
|
|
21
external/dsv.py
vendored
21
external/dsv.py
vendored
|
@ -38,17 +38,26 @@ xls2csv = '%(cpath)s -f %%Y-%%m-%%d %(fpath)s.xls >%(fpath)s.csv'
|
|||
|
||||
class CsvReader(BaseReader):
|
||||
|
||||
encoding = 'UTF-8'
|
||||
elementFactories = {None: Element}
|
||||
fieldNames = ()
|
||||
start = stop = None
|
||||
start = stop = sortKey = None
|
||||
|
||||
def read(self, input):
|
||||
result = []
|
||||
for x in range(self.start or 0):
|
||||
input.readline() # skip lines on top
|
||||
reader = csv.DictReader(input, self.fieldNames)
|
||||
lastIdentifiers = {}
|
||||
for idx, row in enumerate(list(reader)[self.start:self.stop]):
|
||||
rows = list(reader)[:self.stop]
|
||||
if self.sortKey:
|
||||
rows.sort(key=self.sortKey)
|
||||
for idx, row in enumerate(rows):
|
||||
if self.ignoreRow(idx, row):
|
||||
continue
|
||||
currentElements = {}
|
||||
for k, v in row.items():
|
||||
k, v = self.preprocessField(k, v)
|
||||
if k is None:
|
||||
continue
|
||||
type = None
|
||||
|
@ -59,6 +68,8 @@ class CsvReader(BaseReader):
|
|||
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
|
||||
element[k] = v # ?TODO: unmarshall
|
||||
|
@ -70,6 +81,12 @@ class CsvReader(BaseReader):
|
|||
lastIdentifiers[element.type] = id
|
||||
return result
|
||||
|
||||
def ignoreRow(self, idx, row):
|
||||
return False
|
||||
|
||||
def preprocessField(self, k, v):
|
||||
return k, v
|
||||
|
||||
def getDate(self, value, correctBug=False):
|
||||
if not value:
|
||||
return value
|
||||
|
|
Loading…
Add table
Reference in a new issue