Browse Source

new data format

Xi Ruoyao 4 years ago
parent
commit
d39dedf70e
3 changed files with 38 additions and 8 deletions
  1. 36 6
      csv_parser.py
  2. 1 1
      data.py
  3. 1 1
      main.py

+ 36 - 6
csv_parser.py

@@ -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__':

+ 1 - 1
data.py

@@ -1,6 +1,6 @@
 from collections import namedtuple
 
-LocationData = namedtuple('LocationData', 'lat lon eig prec yaw')
+LocationData = namedtuple('LocationData', 'hwid lat lon eig prec yaw press')
 
 def have_location(x):
     return x.lat != None and x.lon != None

+ 1 - 1
main.py

@@ -8,7 +8,7 @@ import recog
 import metric
 
 if __name__ == '__main__':
-    data = csv_parser.parse_data_from_csv('test.csv')
+    data = csv_parser.parse_data_from_csv('test0714.csv')
     entries = recog.recognize_entries(data)
     x = []
     for e in entries: