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
	
	 helmutm
						helmutm