123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- from data import LocationData
- from collections import namedtuple
- ColumnSpec = namedtuple("ColumnSpec", "name format")
- field_fmt = {
- 'lat' : ColumnSpec('latitude', 'f'),
- 'lon' : ColumnSpec('longitude', 'f'),
- 'eig' : ColumnSpec('eigenvalue', 'f'),
- 'prec' : ColumnSpec("precision", 'f'),
- 'hwid' : ColumnSpec('bind_number', 's'),
- 'yaw' : ColumnSpec('pitch', 'f'),
- 'press' : ColumnSpec('airPressure', 'f'),
- }
- def do_convert(s, fmt):
- if fmt == 's':
- return s
- if fmt == 'f':
- return float(s)
- throw("what is this format?")
- def data_from_row(d, yaw_col):
- d1 = {}
- for field in field_fmt:
- name = field_fmt[field].name
- fmt = field_fmt[field].format
- if name in d:
- st = d[name]
- elif ('\ufeff' + name) in d:
- # workaround stupid Windoge BOM
- st = d['\ufeff' + name]
- else:
- st = ''
- if st == '':
- raise KeyError
- d1[field] = do_convert(st, fmt)
- if yaw_col is None:
- d1['yaw'] = 0
- else:
- d1['yaw'] = d[yaw_col]
- if d1['lat'] == 0:
- d1['lat'] = None
- if d1['lon'] == 0:
- d1['lon'] = None
- return LocationData(**d1)
- def parse_data_from_csv(f, yaw_col = None):
- if type(f) == str:
- with open(f) as fd:
- return parse_data_from_csv(fd)
- from csv import DictReader
- rd = DictReader(f)
- ret = []
- for row in rd:
- try:
- ret.append(data_from_row(row, yaw_col))
- except KeyError:
- print("suspicous line:", row)
- return ret
- if __name__ == '__main__':
- print(parse_data_from_csv("test.csv"))
|