ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

干货:按规则定位取值

干货:按规则定位取值 按 Material 规则精准定位取值SignLocal/ValueLocal 寻址问题元素值在表里的位置不固定识别的表格里同一个元素Fe可能在不同的行、不同的列甚至符号和值分居两格。硬编码坐标根本扛不住。第一性原理别死记坐标按规则定位。规则里有在哪找、找谁、值在哪个相对位置。规则结构配置里定义我们的匹配规则里有两个关键字段SignLocal定位锚点描述在这个位置能找到这个元素。比如Fe出现在某列。ValueLocal值的位置描述符号旁边哪个格子是值。# 简化规则rule{Material:Fe,SignLocal:F,# 在F列找FeValueLocal:G,# 值在G列}定位取值defextract_from_sheet(ws,rules):cells{}# cell对象# 先按坐标知道每格文字抬头forrowinws.iter_rows():forcellinrow:txtstr(cell.valueor)forruleinrules:ifrule[SignLocal]intxt:# 找到了锚点去 ValueLocal 取邻格值neighborsws[rule[ValueLocal]str(cell.row)]result[rule[Material]]neighbors.valuereturnresult核心就一句话在行里搜到锚点文本再去同行/同列的另一个坐标取值。关键锚点文本的命中判断用in做包含匹配Fe in text比较容易误命中——Fe2O3也含Fe。所以SignLocal的设计要尽量精确到这一格的文本是该元素而非包含。这一格取舍直接影响准确性是校验配置时最容易返工的点。它解决的问题一段数据元素名在 A 列、符号在 E 列、值在 F 列列位置前后版本还变。硬编码坐标死路一条规则化后改配置就能适配不用动代码。取值这种事写成规则永远比写成坐标健壮。这就是 SignLocal/ValueLocal 的意义。
返回列表