|
@@ -1,13 +1,40 @@
|
|
|
from data import LocationData
|
|
|
+from collections import namedtuple
|
|
|
|
|
|
-field_col_name = {
|
|
|
- 'lat' : '纬度', 'lon' : '经度', 'eig' : '精度估算', 'prec' : "误差",
|
|
|
+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_col_name:
|
|
|
- d1[field] = float(d[field_col_name[field]])
|
|
|
+ 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:
|
|
@@ -20,13 +47,16 @@ def data_from_row(d, yaw_col):
|
|
|
|
|
|
def parse_data_from_csv(f, yaw_col = None):
|
|
|
if type(f) == str:
|
|
|
- with open(f, encoding='gb2312') as fd:
|
|
|
+ with open(f) as fd:
|
|
|
return parse_data_from_csv(fd)
|
|
|
from csv import DictReader
|
|
|
rd = DictReader(f)
|
|
|
ret = []
|
|
|
for row in rd:
|
|
|
- ret.append(data_from_row(row, yaw_col))
|
|
|
+ try:
|
|
|
+ ret.append(data_from_row(row, yaw_col))
|
|
|
+ except KeyError:
|
|
|
+ print("suspicous line:", row)
|
|
|
return ret
|
|
|
|
|
|
if __name__ == '__main__':
|