TG-PlatformPlus/UserScripts/ImportDataToInfluxDB.py

244 lines
8.9 KiB
Python

import datetime, time, sys
import numpy as np
import pyqtgraph as pg
from pyqtgraph.Qt import QtWidgets
def csv_to_nparray(fileName, ContainDateTime, timeRange):
if ContainDateTime == 'True':
ContainDateTime = True
else:
ContainDateTime = False
Filter = 0
itemMaxNum = 50
if ContainDateTime:
timeRange = timeRange.split(',')
if len(timeRange) == 2:
Filter = 1
startTime = datetime.datetime.strptime(timeRange[0].strip(),'%Y/%m/%d %H:%M:%S')
start_timestamp=time.mktime(startTime.timetuple())
stopTime = datetime.datetime.strptime(timeRange[1].strip(),'%Y/%m/%d %H:%M:%S')
stop_timestamp=time.mktime(stopTime.timetuple())
else:
Filter = 0
#读取文件
with open(fileName, "r") as f:
recordTotalNum = len(f.readlines())
f.seek(0)
#读取数据文件中的标题行
itemNames = []
itemNames.append('SampleNO')
if ContainDateTime == False:
itemNames.append('DateTime')
tempStr = f.readline()
tempStr = tempStr.replace(' ','')
tempStr = tempStr.replace('"','')
tempStr = tempStr.replace('\t','')
tempStr = tempStr.replace('\n','')
temp = tempStr.split(',')
for i in range(len(temp)):
temp[i] = temp[i].strip()
if ContainDateTime == True:
temp[0] = 'DateTime'
itemNames.extend(temp)
# print(itemNames)
temp = [item for item in itemNames if len(item)>0]
itemNames = temp[0:itemMaxNum]
print(f"itemNames:{itemNames}")
#读取数据文件中的数据,以浮点数的形式读取
rawData = np.array([])
rawData_list = list(rawData)
recordNum = 1
for i in range(1, recordTotalNum-1):
record = []
line = f.readline()
line = line.replace('"','')
line = line.replace('/', ' ')
line = line.replace('T', ' ')
line = line.replace('Z', '')
line = line.replace('\t', '')
line = line.replace('\n', '')
substrings = line.split(',')
if ContainDateTime:
substrings[0] = substrings[0].split('.')[0]
substrings[0] = substrings[0].replace('-',' ')
substrings[0] = substrings[0].replace(':',' ')
temp = substrings[0].split()
date_str = ""
for value in temp:
if value == '':
temp.remove(value)
datetime_str = temp[0]+'-'+temp[1]+'-'+temp[2]+' '+temp[3]+':'+temp[4]+':'+temp[5]
if datetime_str == '1970-1-1 1:1:1' or datetime_str == '1970-1-1 1:01:01':
datetime_str = temp[0]+'-'+temp[1]+'-'+'2'+' '+temp[3]+':'+temp[4]+':'+temp[5]
dt = datetime.datetime.strptime(datetime_str,'%Y-%m-%d %H:%M:%S')
timestamp=time.mktime(dt.timetuple())
else:
datetime_str = '1971-1-2 1:1:1'
dt = datetime.datetime.strptime(datetime_str,'%Y-%m-%d %H:%M:%S')
timestamp=time.mktime(dt.timetuple())
record.append(recordNum)
record.append(timestamp)
if ContainDateTime:
for j in range(1, min(substrings.__len__(), itemMaxNum)):
try:
record.append(float(substrings[j].replace(' ','')))
except:
record.append(-1)
pass
else:
for j in range(0, min(substrings.__len__(), itemMaxNum)):
try:
record.append(float(substrings[j].replace(' ','')))
except:
record.append(-1)
pass
if Filter:
if record[1] >= start_timestamp and record[1] <= stop_timestamp:
recordNum += 1
rawData_list.append(record)
else:
recordNum += 1
rawData_list.append(record)
print(f"record:{record}")
rawData = np.array(rawData_list)
return itemNames, rawData
if __name__ == '__main__':
#解析参数
fileName = sys.argv[1]
timeRange = sys.argv[2]
ContainDateTime = sys.argv[3]
curveNum = int(sys.argv[4])
itemNamesRaw, recordsRaw = csv_to_nparray(fileName, ContainDateTime, timeRange)
itemNames = itemNamesRaw
records = recordsRaw
if ContainDateTime == 'True':
DisplayTime = True
else:
DisplayTime = False
if DisplayTime == False:
itemNames = np.delete(itemNames, 1, 0)
# print(itemNames)
itemsNum = itemNames.__len__()
# print(itemsNum)
if DisplayTime == False:
records = np.delete(records, 1, 1)
# print(records[:,:])
recordsNum = records.__len__()
#########################################################################################
lasttime = time.time()
Filter = 0
timeRange = ['2023-11-24 10:00:00','2023-11-24 17:00:00']
startTime = datetime.strptime(timeRange[0],'%Y-%m-%d %H:%M:%S')
start_timestamp=time.mktime(startTime.timetuple())
stopTime = datetime.strptime(timeRange[1],'%Y-%m-%d %H:%M:%S')
stop_timestamp=time.mktime(stopTime.timetuple())
if not _filename or not os.path.exists(_filename):
return False, _filename
measurement_name = _filename.split('_')[1] # 替换为你的测量名称
with open(_filename, "r") as f:
recordTotalNum = len(f.readlines())
f.seek(0)
itemNames = []
tempStr = f.readline()
tempStr = tempStr.replace(' ','')
tempStr = tempStr.replace('"','')
tempStr = tempStr.replace('\t','')
tempStr = tempStr.replace('\n','')
itemNames.extend(tempStr.split(','))
for i in range(itemNames.__len__(), 0, -1):
try:
if (itemNames[i] == ''):
itemNames.pop(i)
except:
pass
recordNum = 1
for i in range(1, recordTotalNum-1):
record = []
line = f.readline()
#line = line.replace(' ',',')
#line = line.replace(' ','')
line = line.replace('"','')
line = line.replace('\t', '')
line = line.replace('\n', '')
# line = line[0:-2]
substrings = line.split(',')
# print(substrings)
for k in range(0, substrings.__len__()):
if substrings[k] == '':
substrings.pop(k)
substrings[0] = substrings[0].replace('/',' ')
substrings[0] = substrings[0].replace('-',' ')
substrings[0] = substrings[0].replace(':',' ')
substrings[0] = substrings[0].replace('.',' ')
temp = substrings[0].split()
# print(temp)
datetime_str = ""
for value in temp:
if value == '':
temp.remove(value)
# datetime_str = date_str+' '+temp[0]+':'+temp[1]+':'+temp[2]
if len(temp) > 6:
datetime_str = temp[0]+'-'+temp[1]+'-'+temp[2]+' '+temp[3]+':'+temp[4]+':'+temp[5]+'.'+ temp[6]
else:
datetime_str = temp[0]+'-'+temp[1]+'-'+temp[2]+' '+temp[3]+':'+temp[4]+':'+temp[5]
# datetime_str = substrings[0].replace('/','-')
log.info(datetime_str)
datetime_str = datetime_str.strip()
if datetime_str.count('.') == 0:
time_value = datetime.strptime(datetime_str, '%Y-%m-%d %H:%M:%S').strftime('%Y-%m-%dT%H:%M:%SZ')
time_value_bk = datetime.strptime(datetime_str, '%Y-%m-%d %H:%M:%S')
else:
time_value = datetime.strptime(datetime_str, '%Y-%m-%d %H:%M:%S.%f').strftime('%Y-%m-%dT%H:%M:%S.%fZ')
time_value_bk = datetime.strptime(datetime_str[:-4], '%Y-%m-%d %H:%M:%S')
time_value_st=time.mktime(time_value_bk.timetuple())
data_point = {
"measurement": measurement_name,
# "tags": {},
"time": time_value,
"fields": {}
}
for j in range(1, substrings.__len__()):
try:
data_point['fields'][itemNames[j]] = float(substrings[j].replace(' ',''))
except:
pass
if Filter:
if time_value_st >= start_timestamp and time_value_st <= stop_timestamp:
log.info(data_point)
influxdb.writeFromDict(data_point)
else:
log.info(data_point)
influxdb.writeFromDict(data_point)
recordNum += 1
log.info(time.time() - lasttime)
return