我收到了一些我们用于规划/建模目的的软件报告。程序生成的CSV本质上是4个报告,在一个长csv文件中有自己唯一的标头。每个部分之间的差距每次都不同,具体取决于我们的模拟时间。我一直在练习Python,并意识到我真的应该自动重新格式化这些数据。
我正在尝试找出解析已知标头之间数据的最佳方法,并将各行之间的行写入单个CSV文件。我已经想出如何通过导入csv打开和读取/写入CSV文件。
报告的每个部分的标题总是相同的,只是它们之间的行数每次都不同,所以我不能告诉CSV分割每几百/千行。我觉得像一个循环可能是票,但我很高兴承认我被卡住了!
报告内容如下:
第一个标题
Index,WindowID,WindowStart,WindowEnd,SCID,PlanningStatus,TransmitDeadline,WindowAreaAquired,OrderAreaAcquired,ScansIncluded,ScanDuration,Cost,CameraOff
(...)(X行多行)
第二个标题
Order Id,Occurrence Start,Occurrence End,Has Access,Fulfilled
(...)(X行多行)
第三个标题
Fulfilled Order Ids,Fulfilled Order Targets,Original Area,Unfulfilled (at start),Order Area acquired (at end)
(...)(结果行)
第四个标题
Order,Vehicle,Window ID,Start Time,Type,Mode,Device
(...)第4节的结果
最初,我在查看另外两个问题,标注为我的问题的重复:Question1& Question2。 但是,这两个示例都有重复的标题,而不是唯一的标题。问题1中的代码我认为指向了正确的方向,但我试图找出告诉脚本一旦到达下一个标题行再次重新开始的最佳方法。
我提出了一些我认为不正确的代码: 导入csv 来自io import StringIO
outfile_name = "campaignout_%.csv"
out_num = 1
with open('campaignreport.csv', 'rb') as csvfile:
csvreader = csv.reader(csvfile, delimiter = ',')
csv_buffer = []
for line in csvreader:
if line.startswith("Index"):
csv_buffer.append(row)
elif line.startswith("Order Id"):
with open(outfile_name % out_num, 'wb') as csvout:
for b_row in csv_buffer:
csvout.writerow(b_row)
out_num += 1
csv_buffer = [row]
csv_buffer = []
csv_buffer.append(row)
elif line.startswith("Fulfilled Order Ids"):
with open(outfile_name % out_num, 'wb') as csvout:
for b_row in csv_buffer:
csvout.writerow(b_row)
out_num += 1
csv_buffer = [row]
csv_buffer = []
csv_buffer.append(row)
elif line.startswith("Order"):
with open(outfile_name % out_num, 'wb') as csvout:
for b_row in csv_buffer:
csvout.writerow(b_row)
out_num += 1
csv_buffer = [row]
csv_buffer = []
csv_buffer.append(row)
else:
with open(outfile_name % out_num, 'wb') as csvout:
for b_row in csv_buffer:
csvout.writerow(b_row)
out_num += 1
csv_buffer = [row]