- erste Fassung rein
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from django.utils.encoding import smart_unicode
|
||||
from django.template.defaultfilters import slugify
|
||||
import csv
|
||||
|
||||
def csv_open(csvfile, dialect=None):
|
||||
fh = open(csvfile, 'rb')
|
||||
if dialect is None:
|
||||
sniffer = csv.Sniffer()
|
||||
dialect = sniffer.sniff(fh.read(1024), delimiters=';,\t')
|
||||
fh.seek(0)
|
||||
reader = csv.reader(fh, dialect=dialect)
|
||||
return reader
|
||||
|
||||
|
||||
class CSVRow(object):
|
||||
def __init__(self, field_refinition, row):
|
||||
self.row = row
|
||||
self.firstrow = field_refinition
|
||||
for i, field in enumerate(field_refinition):
|
||||
try:
|
||||
setattr(self, field, smart_unicode(row[i]))
|
||||
except IndexError:
|
||||
setattr(self, field, None)
|
||||
|
||||
def __getattr__(self, name): # 'None'-fallback to make life easy
|
||||
return None
|
||||
def __repr__(self):
|
||||
ret = repr(self.__dict__)
|
||||
return ret
|
||||
def row(self):
|
||||
return self.row
|
||||
|
||||
|
||||
class CSVImport(object):
|
||||
def __init__(self, csvfile, dialect=None, translate=None):
|
||||
self.reader = csv_open(csvfile, dialect)
|
||||
self.rows = []
|
||||
for row in self.reader:
|
||||
self.rows.append(row)
|
||||
self.firstrow = self.rows[0]
|
||||
self.field_definition = []
|
||||
for i, field in enumerate(self.rows[0]):
|
||||
if translate:
|
||||
if field in translate:
|
||||
print field + ' -> '+ translate[field]
|
||||
field = translate[field]
|
||||
field = slugify(field.strip()).replace('-', '_')
|
||||
if not field:
|
||||
field = 'column_%d' % i
|
||||
self.field_definition.append(field)
|
||||
|
||||
def __getitem__(self, key):
|
||||
try:
|
||||
return CSVRow(self.field_definition, self.rows[int(key) + 1])
|
||||
except (ValueError, TypeError):
|
||||
raise IndexError()
|
||||
|
||||
def __iter__(self):
|
||||
for row in self.rows[1:]:
|
||||
yield CSVRow(self.field_definition, row)
|
||||
|
||||
def firstrow(self):
|
||||
return self.firstrow
|
||||
|
||||
|
||||
Reference in New Issue
Block a user