在上文中,我們使用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文件中