打造高效的HIS与DAT文件解析工具

news2025/2/28 15:47:03

在工业数据采集和存储中,HISDAT 文件是非常常见的二进制数据格式。然而,解析这些固定块大小的二进制文件并将其转换为易读的 CSV 格式并非易事。本文将深入讲解如何使用 PythonPyQt5 打造一款图形化工具,轻松解析和转换这些文件,为你扫清数据处理的障碍。


功能概述

这款工具支持:

  • HIS 和 DAT 单个文件转换:将二进制数据解析成 CSV 格式。
  • 批量文件夹转换:支持一次性解析文件夹下所有目标文件。
  • 结果过滤与去重:自动去除全0行和重复数据。
  • 图形用户界面 (GUI):通过 PyQt5 打造直观的操作界面。
  • 日志与进度条:动态显示转换过程的日志信息和进度。

实现步骤

1. 文件解析核心逻辑

我们首先实现了解析固定块大小二进制文件的功能。

def parse_fixed_block_size(file_path, block_size=64, header_size=32):
    results = []
    with open(file_path, 'rb') as file:
        file.seek(header_size)  # 跳过文件头部32字节
        while True:
            position = file.tell()
            chunk = file.read(block_size)
            if not chunk or len(chunk) < block_size:
                break
            try:
                field_count = block_size // 4
                record = struct.unpack(f'{field_count}I', chunk)
                results.append((position, block_size, record))
            except struct.error:
                continue
    return results

解释:

  • block_size 定义每个块的大小(64字节)。
  • 使用 struct.unpack 将二进制数据转换成整型列表。
  • 文件头的偏移量可以通过 seek 跳过。

2. 数据处理与CSV导出

解析结果需要去除多余数据后再导出为CSV:

def process_and_save_to_csv(results, output_path):
    rows = []
    for position, size, record in results:
        row = {"Position": position, "Block Size": size}
        for i, val in enumerate(record):
            row[f"Field{i+1}"] = val
        rows.append(row)

    df = pd.DataFrame(rows)
    if not df.empty:
        valid_df = df.loc[~(df.iloc[:, 2:] == 0).all(axis=1)].drop_duplicates()
    else:
        valid_df = df
    valid_df.to_csv(output_path, index=False, encoding='utf-8-sig')

亮点:

  • 使用 pandas 进行数据处理,去除全零行 (all(axis=1) == 0)。
  • 使用 drop_duplicates 删除重复数据,保证CSV干净整洁。

3. PyQt5用户界面设计

用户界面使用了 PyQt5,结合QFileDialog和QProgressBar等控件,打造了简洁友好的交互体验:

class ConverterUI(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.setWindowTitle('HIS 和 DAT 文件转换工具(固定块解析)')
        self.setGeometry(100, 100, 700, 600)

        main_layout = QVBoxLayout()

        self.title_label = QLabel('HIS & DAT -> CSV 转换工具', self)
        self.title_label.setAlignment(QtCore.Qt.AlignCenter)
        main_layout.addWidget(self.title_label)

        # 文件选择按钮
        self.select_his_btn = QtWidgets.QPushButton('选择HIS文件')
        self.select_his_btn.clicked.connect(self.select_his_file)
        main_layout.addWidget(self.select_his_btn)

        # 日志和进度条
        self.progress_bar = QProgressBar(self)
        self.log_text = QTextEdit(self)
        self.log_text.setReadOnly(True)

        main_layout.addWidget(self.progress_bar)
        main_layout.addWidget(self.log_text)
        self.setLayout(main_layout)

4. 线程处理与进度更新

为了不阻塞界面,我们使用了 QThread 来处理后台转换任务:

class ConverterThread(QtCore.QThread):
    progress = QtCore.pyqtSignal(int)
    log_message = QtCore.pyqtSignal(str)

    def run(self):
        # 模拟处理逻辑
        for i in range(100):
            self.log_message.emit(f"正在处理第 {i+1} 块数据...")
            self.progress.emit(i+1)
            QtCore.QThread.msleep(50)

通过信号与槽机制 (emit),将进度条与日志动态更新到UI中。


5. 界面美化

为了提升用户体验,我们引入了随机渐变背景和按钮样式:

class UIStyler:
    def apply_styles(self):
        colors = ["#3498db", "#2ecc71", "#e74c3c", "#9b59b6", "#e67e22"]
        random_color = random.choice(colors)
        self.widget.setStyleSheet(f"""
            QWidget {{
                background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 {random_color}, stop:1 #ffffff);
            }}
            QPushButton {{
                background-color: {random_color};
                color: white;
            }}
        """)

成果展示

最终运行效果图:

  • 主界面:功能清晰,操作简单。
  • 日志显示:实时反馈处理状态。
  • 进度条:让用户直观了解转换进度。

结语

这款工具结合了 Python 的强大数据处理能力和 PyQt5 的用户界面开发优势,实现了从二进制文件解析到可视化转换的完整流程。不仅可以大幅提高数据转换效率,还能让不熟悉编程的用户轻松上手。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2259233.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式-装饰器模式(结构型)与责任链模式(行为型)对比,以及链式设计

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1.装饰器模式1.1概念1.2作用1.3应用场景1.4特点1.5类与对象关系1.6实现 2责任链模式2.1概念2.2作用2.3应用场景2.4特点2.5类与对象关系2.6实现 3.对比总结 前言…

【JavaEE】网络(2)

一、网络编程套接字 1.1 基础概念 【网络编程】指网络上的主机&#xff0c;通过不同的进程&#xff0c;以编程的方式实现网络通信&#xff1b;当然&#xff0c;我们只要满足进程不同就行&#xff0c;所以即便是同一个主机&#xff0c;只要是不同进程&#xff0c;基于网络来传…

题海拾贝:力扣 141.环形链表

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 1、题…

SEC_ASA 第二天作业

拓扑 按照拓扑图配置 NTP&#xff0c;Server端为 Outside路由器&#xff0c;Client端为 ASA&#xff0c;两个设备的 NTP传输使用MD5做校验。&#xff08;安全 V4 LAB考点&#xff09; 提示&#xff1a;Outside路由器作为 Server端要配置好正确的时间和时区&#xff0c;ASA防…

IDEA 未启用lombok插件的Bug

项目中maven已引用了lombok依赖&#xff0c;之前运行没有问题的&#xff0c;但有时启动会提示&#xff1a; java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled. Your processor is: com.sun.proxy.$Proxy8 Lombok support…

markdown入门

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

知识库系统,集成neo4j,集成activiti工作流,集成es全文检索,知识图谱血缘关系,nlp知识库

一、项目介绍 一款全源码&#xff0c;可二开&#xff0c;可基于云部署、私有部署的企业级知识库云平台&#xff0c;一款让企业知识变为实打实的数字财富的系统&#xff0c;应用在需要进行文档整理、分类、归集、检索、分析的场景。 为什么建立知识库平台&#xff1f; 助力企业…

AI技术架构:从基础设施到应用

人工智能&#xff08;AI&#xff09;的发展&#xff0c;正以前所未有的速度重塑我们的世界。了解AI技术架构&#xff0c;不仅能帮助我们看懂 AI 的底层逻辑&#xff0c;还能掌握其对各行业变革的潜力与方向。 一、基础设施层&#xff1a;AI 技术的坚实地基 基础设施层是 AI 技…

钉钉机器人消息推送类型案例

CSDN 目录展示 目录 钉钉机器人消息推送1- 文本text类型推送代码案例推送结果参数说明 2- 链接Link类型推送代码案例推送结果参数说明 3- Markdown类型推送代码案例1推送结果1推送代码案例2推送结果2推送代码案例2 (版本2)推送结果2(版本2)参数说明 4- 整体跳转ActionCard类型…

6_Sass 选择器函数 --[CSS预处理]

Sass 提供了一系列的选择器函数&#xff0c;用于操作和组合CSS选择器。这些函数可以帮助你更灵活地创建样式规则&#xff0c;并且可以减少重复代码。以下是几个常用的选择器函数及其用法&#xff1a; 1. selector-append($selector1, $selector2...) selector-append($select…

Wireshark如何查看数据包时间间隔

1.如果数据包量不大&#xff0c;抓包本身也不大&#xff0c;建议从绝对时间判断&#xff0c;打开wireshark软件&#xff0c;并点开相应要分析的抓包文件。 进入到最上方菜单<视图>,在弹出菜单选择时间显示格式&#xff0c;再在右侧菜单中选择自捕获经过的秒数。 这样就可…

jvm内存优化方式

1. JVM&#xff08;Java Virtual Machine&#xff09;&#xff1a; • 定义&#xff1a;Java虚拟机&#xff0c;是运行Java字节码的抽象计算机。 • 内存管理&#xff1a;负责内存的分配和回收&#xff0c;是JVM内存优化的核心。 2. 堆&#xff08;Heap&#xff09;&#xff1a…

【AI日记】24.12.13 kaggle 比赛 2-3 大扫除、断舍离、自己做饭

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 参加&#xff1a;kaggle 比赛 Regression with an Insurance Dataset参考&#xff1a;kaggle 回归类入门比赛 House Prices - Advanced Regression Techniques内容&#xff1a;构建自己的EDA&#xff08…

antdv-<a-button>中属性的使用

UI组件库&#xff08;User Interface Component Library&#xff09;是一种预先构建好的、可重用的用户界面元素集合&#xff0c;旨在帮助开发者更快速、更简便地构建用户界面。这些组件通常包括按钮、表单、导航栏、模态框等&#xff0c;能够提供一致的外观和交互风格&#xf…

Nodejs架构

Node.js 是一个开源的 JavaScript 运行时环境&#xff0c;旨在运行可扩展的应用程序。 Node.js 允许开发人员使用 JavaScript 编写服务器端脚本代码。此外&#xff0c;Node.js 具有能够异步 I/O 的事件驱动架构。它基于 Google Chrome 的 V8 引擎构建&#xff0c;用于开发I/O 密…

对于《穿越火线》和《欢乐升级》游戏的理解

对于《穿越火线》的理解与感受 《穿越火线》&#xff08;CrossFire&#xff09;是一款承载了许多玩家青春记忆的经典FPS游戏。在初次接触这款游戏时&#xff0c;它给我的第一感觉是紧张刺激且极具沉浸感。无论是团队竞技的快节奏对抗&#xff0c;还是爆破模式中步步为营的策略…

Vite快速构建Vue教程

步骤 1: 初始化项目目录 创建一个名为 projects 的文件夹&#xff0c;作为存放所有 Vite 项目的根目录。这个文件夹将容纳多个独立的 Vite 项目。 步骤 2: 创建 Vite 项目 右键点击 projects 文件夹并选择“在此处打开终端”或使用您偏好的代码编辑器&#xff08;如 VSCode&…

springboot429校运会管理系统(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装校运会管理系统软件来发挥其高效地信息处理的作用&#xff…

深度学习实验十四 循环神经网络(1)——测试简单循环网络的记忆能力和梯度爆炸实验

目录 一、数据集构建 1.1数据集的构建函数 1.2加载数据集并划分 1.3 构建Dataset类 二、模型构建 2.1嵌入层 2.2SRN层 2.3模型汇总 三、模型训练 3.1 训练指定长度的数字预测模型 3.2 损失曲线展示 四、模型评价 五、修改 附完整可运行代码 实验大体步骤&#x…

SQL去重查询C++ 中面向对象编程如何实现数据隐藏?C++ 中面向对象编程如何处理异常?Pimpl模式

SQL2 查询多列 select device_id,gender,age,university from user_profile; SQL3 查询结果去重 select distinct university from user_profile; select university from user_profile group by university; C 中面向对象编程如何实现数据隐藏&#xff1f; 使用访问控制修饰…