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.logger = getLogger('Loader')
|
||||||
self.groups = {}
|
self.groups = {}
|
||||||
|
|
||||||
def load(self, elements):
|
def load(self, elements, recur=True):
|
||||||
self.loadRecursive(elements)
|
self.loadRecursive(elements, recur)
|
||||||
self.transcript.write('Rows loaded: %(count)i; changes: %(changed)i; '
|
self.transcript.write('Rows loaded: %(count)i; changes: %(changed)i; '
|
||||||
'errors: %(errors)i\n' % self.summary)
|
'errors: %(errors)i\n' % self.summary)
|
||||||
|
|
||||||
def loadRecursive(self, elements):
|
def loadRecursive(self, elements, recur=True):
|
||||||
for element in elements:
|
for element in elements:
|
||||||
element.execute(self)
|
element.execute(self)
|
||||||
if element.subElements is not None:
|
if recur and element.subElements is not None:
|
||||||
self.loadRecursive(element.subElements)
|
self.loadRecursive(element.subElements)
|
||||||
self.summary['count'] += 1
|
self.summary['count'] += 1
|
||||||
|
|
||||||
|
@ -73,6 +73,12 @@ class BaseLoader(object):
|
||||||
self.summary['errors'] += 1
|
self.summary['errors'] += 1
|
||||||
self.logger.error(message)
|
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):
|
def change(self, message=None):
|
||||||
if message is not None:
|
if message is not None:
|
||||||
self.transcript.write(message + '\n')
|
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):
|
class CsvReader(BaseReader):
|
||||||
|
|
||||||
|
encoding = 'UTF-8'
|
||||||
elementFactories = {None: Element}
|
elementFactories = {None: Element}
|
||||||
fieldNames = ()
|
fieldNames = ()
|
||||||
start = stop = None
|
start = stop = sortKey = None
|
||||||
|
|
||||||
def read(self, input):
|
def read(self, input):
|
||||||
result = []
|
result = []
|
||||||
|
for x in range(self.start or 0):
|
||||||
|
input.readline() # skip lines on top
|
||||||
reader = csv.DictReader(input, self.fieldNames)
|
reader = csv.DictReader(input, self.fieldNames)
|
||||||
lastIdentifiers = {}
|
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 = {}
|
currentElements = {}
|
||||||
for k, v in row.items():
|
for k, v in row.items():
|
||||||
|
k, v = self.preprocessField(k, v)
|
||||||
if k is None:
|
if k is None:
|
||||||
continue
|
continue
|
||||||
type = None
|
type = None
|
||||||
|
@ -59,6 +68,8 @@ class CsvReader(BaseReader):
|
||||||
ef = self.elementFactories.get(type)
|
ef = self.elementFactories.get(type)
|
||||||
if ef is None:
|
if ef is None:
|
||||||
raise ValueError('Missing element factory for %r.' % type)
|
raise ValueError('Missing element factory for %r.' % type)
|
||||||
|
if ef == 'ignore':
|
||||||
|
continue
|
||||||
element = currentElements[type] = ef()
|
element = currentElements[type] = ef()
|
||||||
element.type = type
|
element.type = type
|
||||||
element[k] = v # ?TODO: unmarshall
|
element[k] = v # ?TODO: unmarshall
|
||||||
|
@ -70,6 +81,12 @@ class CsvReader(BaseReader):
|
||||||
lastIdentifiers[element.type] = id
|
lastIdentifiers[element.type] = id
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
def ignoreRow(self, idx, row):
|
||||||
|
return False
|
||||||
|
|
||||||
|
def preprocessField(self, k, v):
|
||||||
|
return k, v
|
||||||
|
|
||||||
def getDate(self, value, correctBug=False):
|
def getDate(self, value, correctBug=False):
|
||||||
if not value:
|
if not value:
|
||||||
return value
|
return value
|
||||||
|
|
Loading…
Add table
Reference in a new issue