【无标题】

et-xmlfile==1.1.0
openpyxl==3.1.2

import pickle
import struct
import csv
from openpyxl import Workbook
import time
def parse_data(data):
    packets = []
    start = 0

    while start < len(data):
    # 找到数据包的开始
        index = data.find(b'\xAA\xFF\xF1\x04', start)
        if index == -1:
            break

        # 解析数据内容和校验字节
        content = struct.unpack('<I', data[index+4:index+8])[0]
        check_sum = data[index+8]
        add_check = data[index+9]
        # # 计算校验和
        # sumcheck = sum(data[index:index+8])
        # # 计算累加校验
        # addcheck = sum(data[i] for i in range(index, index+8))

        # 如果校验正确,才将数据包添加到列表
        # if check_sum == sumcheck and add_check == addcheck:
        packets.append((content, check_sum, add_check))
        print(f"Current progress: {start / len(data) * 100}%")
        # 准备解析下一个数据包
        # 打印当前进度

        start = index + 10
    return packets

with open('100.bin', 'rb') as file:
    data = file.read()
    packets = parse_data(data)
    # 打印解析出的数据包
    # for packet in packets:
    #     print(packet, '\n') # 在每个数据包后面添加新行
    # 存储到CSV文件
    # 创建Workbook和Worksheet
    wb = Workbook()
    ws = wb.active
    # 初始文件编号
    file_num = 0
    # 每个文件的数据包数量
    packets_per_file = 5000000
    # 写入表头
    ws.append(['Content', 'CheckSum', 'AddCheck'])
    # 开始时间
    start_time = time.time()
    # 每100万行数据为一组,将数据写入新的一列
    group_size = 1000000
    for i, packet in enumerate(packets):
        group_idx = (i // group_size)
        # 计算在当前组内的行号
        row_idx = (i % group_size) + 1 # +1 是因为Excel表格的行号是从1开始的
        # 计算列号
        col_idx = group_idx * 3 + 1 # +1 是因为Excel表格的列号是从1开始的
        # 将数据写入表格
        for j, item in enumerate(packet):
            ws.cell(row=row_idx, column=col_idx+j, value=item)
            # 计算并打印当前执行速度
            if (i+1) % 1000 == 0: # 每1000条数据打印一次
                elapsed_time = time.time() - start_time
                speed = (i+1) / elapsed_time
                progress = (i+1) / len(packets) * 100
                print(f"Current speed: {speed} rows/second, progress: {progress}%")
                # 如果已经达到每个文件的数据包数量,就保存并关闭当前的工作簿,然后开始一个新的工作簿
                if (i+1) % packets_per_file == 0:
                    wb.save(f'output_{file_num}.xlsx')
                    wb.close()
                    file_num += 1
                    wb = Workbook()
                    ws = wb.active
                    ws.append(['Content', 'CheckSum', 'AddCheck'])

                    # 保存最后一个文件
                    wb.save(f'output_{file_num}.xlsx')
    # 保存到Excel文件
    print(f"正在储存到Excel文件中...")
    wb.save('100.xlsx')
    print(f"正在储存...")
import pickle
import struct
import csv
from openpyxl import Workbook
import time
def parse_data(data):
    packets = []
    start = 0

    while start < len(data):
    # 找到数据包的开始
        index = data.find(b'\xAA\xFF\xF1\x04', start)
        if index == -1:
            break

        # 解析数据内容和校验字节
        content = struct.unpack('<I', data[index+4:index+8])[0]
        check_sum = data[index+8]
        add_check = data[index+9]
        # # 计算校验和
        # sumcheck = sum(data[index:index+8])
        # # 计算累加校验
        # addcheck = sum(data[i] for i in range(index, index+8))

        # 如果校验正确,才将数据包添加到列表
        # if check_sum == sumcheck and add_check == addcheck:
        packets.append((content, check_sum, add_check))
        print(f"Current progress: {start / len(data) * 100}%")
        # 准备解析下一个数据包
        # 打印当前进度

        start = index + 10
    return packets

with open('100.bin', 'rb') as file:
    data = file.read()
    packets = parse_data(data)
    # 打印解析出的数据包
    # for packet in packets:
    #     print(packet, '\n') # 在每个数据包后面添加新行
    # 存储到CSV文件
    # 创建Workbook和Worksheet
    wb = Workbook()
    ws = wb.active

    # 写入表头
    ws.append(['Content', 'CheckSum', 'AddCheck'])
    # 开始时间
    start_time = time.time()
    # 每100万行数据为一组,将数据写入新的一列
    group_size = 1000000
    for i, packet in enumerate(packets):
        group_idx = (i // group_size)
        # 计算在当前组内的行号
        row_idx = (i % group_size) + 1 # +1 是因为Excel表格的行号是从1开始的
        # 计算列号
        col_idx = group_idx * 3 + 1 # +1 是因为Excel表格的列号是从1开始的
        # 将数据写入表格
        for j, item in enumerate(packet):
            ws.cell(row=row_idx, column=col_idx+j, value=item)
            # 计算并打印当前执行速度
            if (i+1) % 1000 == 0: # 每1000条数据打印一次
                elapsed_time = time.time() - start_time
                speed = (i+1) / elapsed_time
                progress = (i+1) / len(packets) * 100
                print(f"Current speed: {speed} rows/second, progress: {progress}%")
    # 保存到Excel文件
    print(f"正在储存到Excel文件中...")
    wb.save('100.xlsx')

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值