我的 cust_peformat_test.csv 文件包含以下内容:
AV-IM-1-13991730,6,2014-06-01 00:10,0.96
AV-IM-1-13991730,6,2014-06-01 00:15,0.92
AV-IM-1-13991730,6,2014-06-01 00:20,0.97
AV-IM-1-13991731,6,2014-06-01 00:10,1.96
AV-IM-1-13991731,6,2014-06-01 00:15,1.92
AV-IM-1-13991731,6,2014-06-01 00:20,1.97
AV-IM-1-13991732,6,2014-06-01 00:10,2.96
AV-IM-1-13991732,6,2014-06-01 00:15,2.92
AV-IM-1-13991732,6,2014-06-01 00:20,2.97
我编写了一个python脚本来重新格式化这个文件以生成另外两个文件,其内容如下所示:
文件-1: custpower.csv :
# file...... Recorder file
# date...... Thu Mar 12 14:35:32 2015
# user...... Sri
# host...... (null)
# group..... None
# property.. Avista Measurements
# limit.....
# interval..
# timestamp
2014-06-01 00:15,0.92,1.92,2.92
2014-06-01 00:20,0.97,1.97,2.97
2014-06-01 00:10,0.96,1.96,2.96,
文件-2:的 powersensornames.csv :
AV-IM-1-13991730,AV-IM-1-13991731,AV-IM-1-13991732,
这正是我想要的,除非我的 cust_peformat_test.csv 的数据组织得不好并且如果它看起来像这样,否则它会很完美:
AV-IM-1-13991730,6,2014-06-01 00:10,0.96
AV-IM-1-13991730,6,2014-06-01 00:15,0.92
AV-IM-1-13991731,6,2014-06-01 00:15,1.92
AV-IM-1-13991731,6,2014-06-01 00:20,1.97
AV-IM-1-13991730,6,2014-06-01 00:20,0.97
AV-IM-1-13991731,6,2014-06-01 00:10,1.96
AV-IM-1-13991732,6,2014-06-01 00:10,2.96
AV-IM-1-13991732,6,2014-06-01 00:15,2.92
AV-IM-1-13991732,6,2014-06-01 00:20,2.97
弄乱了 custpower.csv 的内容,看起来像这样:
# file...... Recorder file
# date...... Thu Mar 12 14:35:32 2015
# user...... Sri
# host...... (null)
# group..... None
# property.. Avista Measurements
# limit.....
# interval..
# timestamp
2014-06-01 00:15,1.96,2.96,,,2.92
2014-06-01 00:20,,,,,2.97
这是不正确的。尝试弄清楚我的代码有什么问题一直很痛苦,这是我的代码:
'''
Created on Jun 18, 2015
@author: sg
'''
#import datetime
#import csv
'''
#cust_power_real_recorder = open("Custmeters_preformat.csv",'w')
cust_power_real_reader = csv.reader(open("SPU123_customer_meters_power_kw.csv",'r'),delimiter=',')
spu123_meters=[]
for i,line in enumerate(cust_power_real_reader):
if i>0:
#d = datetime.datetime.strptime(line[6],'%Y-%m-%d %H:%M:%S')
if line[5][8:] not in spu123_meters:
spu123_meters.append(line[5][8:])
#cust_power_real_recorder.writelines([line[5],',6,',line[6],',',line[10],'\n'])
#cust_power_real_recorder.close()
'''
'''open('data.csv','w').write(
"""\
13986513,6,6/1/2014 12:00:00 AM,248.7
13986513,6,6/1/2014 12:00:05 AM,248.4
13986513,6,6/1/2014 12:00:10 AM,249
13986513,6,6/1/2014 12:00:15 AM,249.3
13986513,6,6/1/2014 12:00:20 AM,249.3
13986513,6,6/1/2014 12:00:25 AM,249.3
13986513,6,6/30/2014 11:55:00 PM,249.3
13986534,6,6/1/2014 12:00:00 AM,249
13986534,6,6/1/2014 12:00:05 AM,249
13986534,6,6/1/2014 12:00:10 AM,249.3
13986534,6,6/1/2014 12:00:15 AM,249.6
13986534,6,6/30/2014 11:55:00 PM,249.7\
""")
'''
header = '''# file...... Recorder file
# date...... Thu Mar 12 14:35:32 2015
# user...... Sri
# host...... (null)
# group..... None
# property.. Avista Measurements
# limit.....
# interval..'''
#DECLARE THE FILE YOU WANT TO SPIT OUT
#testvolt = open("testvolt.csv",'w')
#testvolt.writelines([header,'\n','# timestamp\n'])
testpower = open("custpower.csv",'w')
testpower.writelines([header,'\n','# timestamp\n'])
class ReadSensorLines(object):
def __init__(self, filename):
sensor_offsets = {}
sensors = []
readfp = open(filename, "rb")
readfp.readline() # skip header
# find start of each sensor
# use readline not iteration so that tell offset is right
offset = readfp.tell()
sensor = ''
while True:
line = readfp.readline()
if not line:
break
next_sensor = line.split(',', 1)[0]
if next_sensor != sensor:
if sensor:
sensors.append(sensor)
next_offset = readfp.tell()
sensor_offsets[sensor] = [offset, next_offset - offset]
sensor = next_sensor
offset = next_offset
else:
# setup for first sensor
sensor = next_sensor
if next_sensor:
sensors.append(next_sensor)
sensor_offsets[next_sensor] = [offset, readfp.tell() - offset]
self.readfp = readfp
self.sensor_offsets = sensor_offsets
self.sensors = sensors
def read_sensor(self, sensorname):
pos_data = self.sensor_offsets[sensorname]
self.readfp.seek(pos_data[0])
line = self.readfp.readline(pos_data[1])
pos_data[0] += len(line)
pos_data[1] -= len(line)
return line
@property
def data_remains(self):
return any(pos_data[1] for pos_data in self.sensor_offsets.itervalues())
def close(self):
self.readfp.close()
sensor_lines = ReadSensorLines("cust_peformat_test.csv") #READ THE CVS FILE U WANT TO MODIFY.
#In abive, delete.csv is for voltage recorder generation and Custmeters_preformat.csv is for power recorder generation
AllSensors=[]
while sensor_lines.data_remains:
row = []
for sensor in sensor_lines.sensors:
if sensor not in AllSensors:
AllSensors.append(sensor)
sensor_line = sensor_lines.read_sensor(sensor)
if sensor_line:
_, _, date, volts = sensor_line.strip().split(',')
row.append(volts)
else:
row.append('')
row.insert(0, date)
#print ','.join(row)
#print row
'''
#below if else is ONLY for voltage csv files
if '2014-06-' not in row[0]:
row[0] = str(datetime.datetime.strptime(row[0],'%m/%d/%Y %H:%M'))
else:
row[0] = str(datetime.datetime.strptime(row[0],'%Y-%m-%d %H:%M:%S'))
#voltage csv file if else case ENDS
'''
#testvolt.writelines([','.join(row),'\n']) # this is for voltage files
testpower.writelines([','.join(row),'\n']) # this is for power files
sensornames = open("powersensornames.csv",'w') #THIS IS THE FILE WHERE THE HEADERS ARE WRITTEN
#In above, sensornames.csv is for voltage recorder and powersensornames.csv is for power recorder generation
for asensor in AllSensors:
sensornames.writelines([asensor,','])