在上文中,我们使用android收集到的数据存放在TXT文件中,一帧格式如下:(暂时去除magnetic数据信息)
[(device:F8:F0:05:F3:67:4C rssi:-90 floorNum:1 locationNum:1), (device:F8:F0:05:F3:67:D5 rssi:-80 floorNum:1 locationNum:1), (device:F0:F8:F2:C7:E9:61 rssi:-73 floorNum:1 locationNum:1), (device:F8:F0:05:F3:67:35 rssi:-97 floorNum:1 locationNum:1), (device:F8:F0:05:F3:67:E7 rssi:-97 floorNum:1 locationNum:1)]
为了方便我们的模型构建,我们将TXT文件转换为CSV文件,方便数据字典的建立。
DC1 | DC2 | DC3 | DC4 | DC5 | DC6 | DC7 | DC8 | DC9 | DC10 | floor | locationNum |
90 | 80 | 73 | 97 | 97 | 100 | 100 | 100 | 100 | 100 | 4 | 4 |
其中,DC*表示BLE基站的不同设备在某点处该BLE基站的RSSI转换值。可以这样想,在一个建筑物内,共有10个BLE主机,那么这个房间的地图模型根据这10个主机会独一无二。每个点处都会采集到这10个ble主机的RSSI信号值。位置发生改变,信号值发生改变。
以下使用python3.6进行TXT转CSV的实现:
基于基本的测试实现,在这里不考虑多线程处理出具的问题。源码如下:(其中多处使用正则表达式)
def magnAndRssiTxt2Csv(magnAndRssiTxt, magnAndRssiCsv):
with open(magnAndRssiTxt, 'r') as recDate:
# 读取训练文件
eachline = recDate.read().splitlines()
with open(magnAndRssiCsv, 'w', newline='') as csvFile:
# 写csv头
csvFileHead = [
'DC1', 'DC2', 'DC3', 'DC4', 'DC5',
'DC6', 'DC7', 'DC8', 'DC9', 'DC10',
'floorNum'
'locationNum'
]
writer = csv.DictWriter(csvFile, fieldnames=csvFileHead)
writer.writeheader()
for i in range(len(eachline)):
devIDDict = {
'DC1': '100', 'DC2': '100', 'DC3': '100', 'DC4': '100', 'DC5': '100',
'DC6': '100', 'DC7': '100', 'DC8': '100', 'DC9': '100', 'DC10': '100',
'floorNum': '',
'locationNum': '',
}
oneLocationPkg = eachline[i].strip('[]').split(', ')
if oneLocationPkg == ['']:
continue
for j in range(len(oneLocationPkg)):
devMassage = ast.literal_eval(json.dumps(oneLocationPkg[j])).strip('()')
devItem = devMassage.split(' ')[0].split(':', 1)[1]
if devItem in devIDDict:
rssiValue = -(float(devMassage.split(' ')[1].split(':', 1)[1]))
if rssiValue > 100:
rssiValue = 100
devIDDict[devItem] = rssiValue
devIDDict['floorNum'] = devMassage.split(' ')[2].split(':', 1)[1]
devIDDict['locationNum'] = devMassage.split(' ')[3].split(':', 1)[1]
writer.writerow(devIDDict)
之后运行,就可以将TXT文件读取写入CSV文件中
欢迎大家批评!