分部分项工程量清单计价表数据清洗Skill
本Skill提供自动化清洗和合并分部分项工程量清单计价表数据的能力。
功能概述
本Skill用于处理和整合多个Excel工作簿中的分部分项工程量清单计价表数据,实现:
- 自动识别包含"分部分项"数据的工作表
- 智能提取和标准化8个核心字段
- 数据清洗、验证和去重
- 合并所有有效数据为统一格式
- 标注数据来源便于追溯
使用场景
- 工程造价审计与分析
- 多专业清单数据汇总
- 项目成本对比分析
- 清单数据标准化处理
核心处理流程
1. 输入参数
| 参数 | 说明 | 默认值 |
|------|------|--------|
| input_folder | Excel文件所在文件夹路径 | 必填 |
| output_file | 输出文件路径 | 必填 |
| sheet_key_word | 目标工作表特征值 | 分部分项 |
| header_rows | 列识别搜索范围 | 20 |
2. 处理步骤
Step 1: 扫描Excel文件
- 扫描指定文件夹中的所有
.xlsx和.xls文件 - 排除临时文件(如
~$开头的文件)
Step 2: 识别有效工作表
- 遍历每个工作簿中的所有工作表
- 检查工作表名称或前10行内容是否包含特征值(如"分部分项")
- 跳过空表
- 取第一个匹配的工作表作为数据源
Step 3: 列识别与验证
- 在前N行(默认20行)中搜索以下8个必需字段:
- 序号
- 项目编码
- 项目名称
- 项目特征
- 计量单位
- 工程量
- 单价
- 合价
- 支持多关键字匹配(见关键字映射表)
- 验证:8个字段必须全部存在,否则跳过该工作表
Step 4: 行识别与提取
- 遍历"序号"列的每一行
- 判断序号是否为有效值:
- 整数 (1, 2, 3...)
- 小数 (1.1, 1.2, 2.1...)
- 字符串格式 ("1", "2.1")
- 有效行:保留并提取指定列的数据
- 无效行:跳过
Step 5: 数据清洗与验证
- 合并单元格处理:向前填充空值
- 空值处理:关键字段不能为空
- 数值验证:工程量、单价、合价必须为非负数
- 格式标准化:统一数据类型
Step 6: 添加数据来源列
- 在最后新增一列"数据来源"
- 填充值:工作簿名称(不含扩展名)
Step 7: 合并所有数据
- 将所有有效工作表的数据纵向合并
- 重置索引
Step 8: 输出结果
- 保存为Excel文件 (.xlsx)
- 可选:同时输出清洗日志
关键字映射表
| 字段名称 | 匹配关键字(按优先级) |
|----------|------------------------|
| 序号 | 序号, 编号, 流水号, # |
| 项目编码 | 项目编码, 编码, 项目编号, 清单编码|
| 项目名称 | 项目名称, 名称 |
| 项目特征 | 项目特征, 项目特征描述, 特征描述 |
| 计量单位 | 计量单位, 单位 |
| 工程量 | 工程量, 数量, 工程数量 |
| 单价 | 单价, 综合单价, 单价合计 |
| 合价 | 合价, 合价金额, 综合合价 |
判断条件
有效工作表条件
IF 工作表非空
AND 工作表名称或前10行内容包含特征值
THEN 为候选工作表
有效列条件
IF 在前20行中找到所有8个必需字段
THEN 列识别成功,继续处理
ELSE 跳过该工作表
有效行条件
IF 序号列的值满足以下任一条件:
- 是整数
- 是浮点数(如1.1, 2.5)
- 是可转换为数字的字符串
AND 序号值 > 0
THEN 为有效行
ELSE 跳过该行
有效数据条件
IF 以下条件同时满足:
- 项目编码 非空
- 工程量 >= 0
- 单价 >= 0
- 合价 = 工程量 x 单价(可选验证)
THEN 数据有效
ELSE 标记异常(可选:保留并标记,或跳过)
输出字段
| 序号 | 字段名称 | 说明 | |------|----------|------| | 1 | 序号 | 清单项序号 | | 2 | 项目编码 | 清单项目编码 | | 3 | 项目名称 | 清单项目名称 | | 4 | 项目特征 | 项目特征描述 | | 5 | 计量单位 | 计量单位 | | 6 | 工程量 | 工程数量 | | 7 | 单价 | 综合单价 | | 8 | 合价 | 合价金额 | | 9 | 数据来源 | 来源工作簿名称 |
异常处理
| 异常场景 | 处理方式 | |----------|----------| | 文件夹不存在 | 报错终止 | | Excel文件无法打开 | 跳过该文件,记录日志 | | 找不到匹配的工作表 | 跳过该工作簿 | | 必需字段缺失 | 跳过该工作表 | | 序号格式异常 | 跳过该行 | | 数值为负数 | 标记异常(可选保留或跳过) | | 合并单元格导致空值 | 向前填充 |
配置选项
| 配置项 | 说明 | 默认值 |
|--------|------|--------|
| skip_negative_values | 是否跳过负数值 | False |
| fill_merged_cells | 是否填充合并单元格 | True |
| validate_formula | 是否验证合价=工程量x单价 | False |
| output_log | 是否输出清洗日志 | True |
使用方法
基础用法
调用本Skill时,提供以下信息:
- 输入文件夹路径 - 包含Excel文件的文件夹
- 输出文件路径 - 合并后文件的保存位置
示例请求:
请使用boq-cleaner skill清洗并合并以下文件夹中的分部分项工程量清单:
输入:C:/Users/18357/Desktop/数据清洗Skill测试表格/
输出:C:/Users/18357/Desktop/清洗结果.xlsx
高级用法
可以指定可选参数:
- 自定义工作表关键字(默认"分部分项")
- 调整列识别搜索范围(默认前20行)
- 启用/禁用数据验证选项
实现说明
本Skill使用Python实现,依赖以下库:
pandas- 数据处理openpyxl- Excel文件读写
核心处理逻辑:
- 使用
pandas.ExcelFile()打开工作簿 - 遍历工作表,使用关键字匹配识别目标工作表
- 在前N行搜索列标题,建立列索引映射
- 使用正则表达式和类型检查识别有效数据行
- 应用数据清洗规则(填充空值、验证数值等)
- 使用
pandas.concat()合并所有数据 - 输出到新的Excel文件
注意事项
- 文件格式 - 仅支持 .xlsx 和 .xls 格式
- 内存使用 - 处理大量文件时需注意内存占用
- 中文支持 - 确保系统环境支持UTF-8编码
- 数据备份 - 建议在处理前备份原始数据
- 日志查看 - 启用
output_log可查看详细处理记录
示例
示例1:基础清洗和合并
用户输入:
请帮我清洗和合并这些工程量清单文件:
输入文件夹:C:/Users/18357/Desktop/项目A/
输出文件:C:/Users/18357/Desktop/项目A-合并清单.xlsx
Skill执行:
- 扫描 "C:/Users/18357/Desktop/项目A/" 中的所有Excel文件
- 识别每个文件中包含"分部分项"的工作表
- 提取8个核心字段的数据
- 清洗并验证数据
- 合并所有数据并添加"数据来源"列
- 输出到 "C:/Users/18357/Desktop/项目A-合并清单.xlsx"
示例2:自定义关键字
用户输入:
使用boq-cleaner skill处理这些文件,工作表关键字是"清单",
输入:C:/Users/18357/Desktop/数据/
输出:C:/Users/18357/Desktop/结果.xlsx
Skill执行:
- 使用"清单"作为工作表匹配关键字(而非默认的"分部分项")
- 其他处理步骤相同
技术支持
如遇问题,请检查:
- 输入文件夹路径是否正确
- Excel文件是否损坏或加密
- 工作表是否包含必需的8个字段
- 系统是否已安装所需Python库(pandas, openpyxl)
可在 ~/.workbuddy/skills/boq-cleaner/ 目录下查看详细日志和中间处理结果。
微信扫一扫