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