69 lines
2.0 KiB
Python
69 lines
2.0 KiB
Python
#!/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
|
|
|
|
|