原文地址:https://itxiaozhang.com/hmdb-xml-export-csv-and-split-5-parts/
如果您需要远程电脑维修或者编程开发,请加我微信咨询。
需求说明
HMDB(Human Metabolome Database)离线数据库以 XML 格式存储,单文件体积较大,二十多万条代谢物记录无法直接查看和筛选。
本次需求是把离线 XML 中需要的字段一次性提取出来,整理成 CSV 表格,并等分成 5 份,方便逐份查看、传输和交付。具体目标如下:
- 从
hmdb_metabolites.xml中读取每一条代谢物记录。 - 提取固定的 12 个字段,包含标识、结构信息和分类信息。
- 导出 UTF-8-SIG 编码的 CSV,保证 Windows 下 Excel 直接打开不乱码。
- 把主 CSV 等分成 5 份,每份行数尽量接近。
- 导出完成后自动自检,输出行数、唯一性和空值统计。
最终 CSV 固定包含以下字段:
其中「分子量」等字段存在多个候选数据来源,程序按内部优先级自动选取;「所属通路」「来源」「同义词」属于多值字段,需要去重后合并到同一个单元格。
程序设计
整体流程分为三步:解析 XML 导出主 CSV → 等分切割 5 份 → 自检并输出报告。
一、流式解析 XML
HMDB XML 体积较大,直接整体加载会占用大量内存。程序采用流式解析方式逐条读取代谢物记录,处理完一条即释放相关节点:
每条记录的字段映射关系,以及分子量等字段的取值优先级,属于脚本内部处理规则,此处不展开。
二、多值字段处理
「所属通路」「来源」「同义词」这类字段在原始数据中可能重复,直接拼接会产生冗余内容。程序统一做去重后合并到同一个单元格,分隔符由脚本内部固定。
其中「来源」无法直接读取,需要按 HMDB 本体层级逐层匹配后收集目标节点:
去重合并部分:
三、等分切割
切割前先统计主 CSV 的数据行数,再按份数计算每份应包含的目标行数,除不尽的余数依次分配到前几份,保证各分片行数差距不超过 1 行:
分片文件命名为 hmdb_selected_fields.part0001.csv 这类形式,写入到 splits_5 目录,每份都带完整表头。
四、自检报告
程序在导出和切割完成后自动校验,主要检查项包括:
- 主 CSV 表头是否与预期一致,每行列数是否正确。
- 5 份分片行数合计是否等于主 CSV 行数。
- 分片表头是否与主 CSV 一致。
- HMDB ID 是否存在重复。
- 每一列的空值数量与占比。
安全机制
考虑到脚本涉及文件写入和批量切割,加入了以下保护设计:
- 默认不覆盖:输出文件已存在时直接报错并终止,必须在命令行显式加上
--force参数才会覆盖,避免误删已有结果。 - 抽样试跑:提供
--limit参数,可以只处理前 N 条记录,先验证字段提取是否正确,再执行全量导出。 - 输入校验:启动时检查源 XML 是否存在,不存在时直接抛出
FileNotFoundError;切割前检查主 CSV 是否有数据行、行数是否少于切割份数。 - 一致性校验:自检阶段逐项核对行数、表头和 ID 唯一性,一旦发现问题会打印明细并以非零状态码退出,便于在自动化流程中捕获失败。
使用方法与运行结果
脚本的源 XML 路径、输出路径和切割份数均在代码中固定,无需配置参数,普通用户只需运行:
| |
首次使用或想先验证字段是否正确,建议先抽样试跑:
| |
其中:
--limit指定只处理前 N 条记录,0表示全量。--force表示允许覆盖已存在的产出文件。
运行过程中会按进度打印处理条数,结束后输出自检报告:
| |
(上方行数为结构示意,实际以本机数据库为准。)
实现效果
脚本把原本需要人工反复翻查的字段提取工作压缩成一条命令:一次运行即可完成 XML 解析、12 个字段导出、5 份等分切割和全套自检。输出 CSV 可直接用 Excel 打开,分片后的文件体积适中,方便分发和比对。
对于代谢物数据整理、离线数据库转换、大批量字段提取等场景,这类固定口径的脚本可以减少重复劳动,同时通过自检报告保证结果可信。