indoorLocation(3)--TXT轉CSV

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章