4. 仪器数据格式解析
仪器数据接入的第一道硬仗,往往不是网络连通,而是“文件读不懂”。同一台液相色谱可能导出 CSV,同一台酶标仪可能导出 Excel,而某些老式原子吸收仪只肯吐出定宽 TXT 或专有二进制。解析策略的核心不是写一个万能解析器,而是先识别格式族,再针对该族的“结构锚点”设计读取路径,最后把仪器字段稳定映射到 LIMS 的样品、检测项目、结果、单位、时间等标准字段上。
一、按格式族选择解析策略
CSV 与 TXT 属于“分隔/定宽文本族”。CSV 的关键是分隔符、引号转义和表头行位置;TXT 则要区分制表符分隔、空格对齐还是固定列宽。例如某生化分析仪导出的 TXT 前 3 行是仪器状态,第 4 行才是列名,第 5 行起为数据。解析时应先按行扫描,定位包含“SampleID”“Result”等关键词的行作为表头锚点,再向下读取数据,而不是硬编码从第 1 行开始。
Excel 属于“工作簿族”,一个文件可能含多个 Sheet,且存在合并单元格、多级表头、公式结果与显示值不一致等问题。解析时优先读取单元格的“值”而非“公式”,并显式指定 Sheet 名或按索引定位。若表头跨两行,可先读取前两行做列名拼接,例如“检测项目”+“结果”合并为“检测项目_结果”。
XML 与 JSON 属于“结构化树族”。XML 依赖标签路径,JSON 依赖键路径。解析策略是先用 XPath 或 JSONPath 定位到结果数组,再逐节点提取。例如 XML 中 /Report/Sample/Test/Result 对应一个结果值;JSON 中 $.samples[*].tests[*].value 对应结果数组。这类格式通常自带字段名,映射难度较低,但要注意命名空间和数组嵌套深度。
PDF 属于“版面还原族”,解析难度最高。若 PDF 由文本层生成,可用坐标定位提取;若为扫描件,则需 OCR。实际工程中,PDF 解析应优先确认是否含文本层,再决定是否走 OCR 路径。专有二进制则属于“协议逆向族”,通常需要厂商提供 DLL、文档或抓包分析,解析时按字节偏移和数据类型(如 int16、float32)逐段读取,并做字节序校验。
二、编码问题:先探测,再转码,最后校验
编码是文本解析中最隐蔽的坑。UTF-8 带 BOM 的文件,第一个字段名可能变成“\ufeffSampleID”,导致映射失败;GBK 文件若按 UTF-8 读取,中文项目名会变成乱码。工程做法是:先读取前 4 个字节判断 BOM,再按候选编码(UTF-8、GBK、Latin-1)尝试解码,选择“解码后无替换字符且中文可读”的编码。对于 CSV,还要处理引号内换行:不能简单按行 split,而应使用支持引号转义的解析器,或先按引号状态机扫描。
Excel 的日期字段常以序列号存储,例如 45123 表示 2023-07-15。解析时需判断单元格格式,若为日期格式则转换为 ISO 8601 字符串。PDF 若含文本层,提取出的文字可能因字体映射出现“缺字”,此时应保留原始坐标和字体信息,必要时回退到 OCR。专有二进制则要先确认字节序:小端模式下 float32 的 0x00 0x00 0x80 0x3F 对应 1.0,大端则完全不同。
三、字段映射:从仪器字段到 LIMS 标准字段
字段映射不是简单改名,而是建立“仪器字段 → 中间记录 → LIMS 标准字段”的三段式映射。中间记录的作用是隔离仪器差异,让后续入库逻辑统一。映射表应包含:仪器字段名、示例值、目标字段、转换规则、是否必填、异常处理。例如仪器字段“Sample”映射到“样品编号”,规则为去除前后空格并转大写;仪器字段“Conc.”映射到“结果值”,规则为提取数字并保留 4 位有效数字;仪器字段“Unit”映射到“单位”,规则为统一为“mg/L”“%”等标准单位。
对于 XML/JSON,映射可直接用路径表达式配置,例如 $.sample.id → 样品编号。对于 CSV/TXT,映射依赖列索引或表头名,建议优先用表头名,列索引作为兜底。对于 PDF,映射需结合坐标区域,例如“结果”列位于 x=300~400 区间,则按坐标截取。对于专有二进制,映射需按字节偏移定义,例如偏移 0x20 起 4 字节为结果值 float32。
四、异常处理与可追溯性
解析过程中必须保留原始行号和解析状态。遇到无法解析的行,不要直接丢弃,而是写入“解析异常表”,记录文件名、行号、原始内容、错误类型(编码错误、字段缺失、类型转换失败)。这样在 LIMS 中可追溯每一条结果的来源,也便于仪器工程师回查。对于批量文件,建议按“文件级 → 行级”两级状态管理:文件级标记“已解析/部分失败/失败”,行级标记“成功/跳过/错误”。
最后,解析结果在入库前应做一次“字段完整性校验”:样品编号非空、检测项目在 LIMS 项目字典中存在、结果值可转为数值、单位在允许单位列表中。校验不通过的行进入待处理队列,由人工确认后再入库。这样既保证自动化效率,又避免脏数据污染 LIMS。