Install
openclaw skills install @kormendierijon681-oss/sgcfx-hongye-parse本地解析宏业清单计价专家 .SGCFX 工程文件,免软件授权导出分部分项工程量清单、工料机材料汇总、费用汇总六段式,并做送审/审核多版本核减对比,输出规范 Excel。触发词:SGCFX、计价文件导出Excel、工程量清单、材料用量、核减对比、送审审核。
openclaw skills install @kormendierijon681-oss/sgcfx-hongye-parse核心结论:SGCFX 是 ZIP 容器,内层文件未加密、明文存储。 不要相信"加密了、必须装 Windows 宏业软件才能导出"的判断。
# 1 解包(注意:解出的文件权限可能是 000,必须 chmod)
mkdir -p ./tmp_sgcfx && unzip -o "<file>.SGCFX" -d ./tmp_sgcfx
chmod -R u+rw ./tmp_sgcfx # 不 chmod 会 Permission denied
# 2 清单明细(3003 表)→ Excel
python3 scripts/export_boq.py ./tmp_sgcfx 4 ./输出 # 4 = 其中一个版本盘册
python3 scripts/export_boq.py ./tmp_sgcfx 3 ./输出 # 3 = 另一个版本盘册
# 3 费用汇总六段式(3010 表)→ Excel
python3 scripts/export_cost.py ./tmp_sgcfx 4 ./输出
# 4 材料工料机(3007 表)
python3 scripts/p3007.py $(find ./tmp_sgcfx -path '*/3007') # 看解析率,应 ≥99%
python3 scripts/agg3007.py # 聚合 CSV
顶层数字目录语义:两个数字目录通常是两个保存版本(如 3/ 旧版、4/ 新版),
不是送审/审结。版本定名靠 SysData 里的中文大写金额串,不靠目录名。
表头 96 字节:
+0 数据区总长 +4 schema区长度 +8 / +12 保留
+16 表ID(如 3003) +20 起 版本号(UTF-16 "10.025")
数据区起点 = 96 + schema区长度
字符串 = [uint32 字符数][UTF-16LE] ← 数值也常以字符串冗余存储
数值 = IEEE754 双精度小端
记录类型标记(数据区靠这个切分):
| 标记 | 含义 |
|---|---|
F段N | 分部 |
F目N | 清单项(分部分项) |
F定N | 定额子目(清单下挂) |
| ID | 内容 |
|---|---|
3003 | 分部分项工程量清单(含量价) |
3007 | 工料机汇总表(材料用量) |
3010 | 单位工程费用汇总(六段式) |
3004/3005/3006 | 措施 / 其他项目 |
3011/3012 | 费用汇总模板 |
0/1005 | 单项工程汇总 |
0/1032 | 编制说明 |
Tree | 明文结构树(单项工程 → 单位工程) |
行结构(按此顺序解析,已实测验证):
序号(字符串) → 工程量(字符串!) → F目N → 清单编码(12位) → 定额编号(9位)
→ 项目名称 → 单位 → [数值区] → 项目特征 → 工程量计算规则 → …
两个必须记住的坑:
工程量是字符串存储的,不是 double。
形如 '3.6'、'73.5'、'46.56'、'1155.91'。
去读 double 会得到垃圾值或 0 —— 这是最容易翻车的地方。
取法:在 F目N 之前的字符串中,找最近一个匹配 ^-?\d+(\.\d+)?$ 的串。
单价/合价是 12 字节步长的成对结构。
以"单位"字符串结束位置为数值区起点 st:
st + 0 = 综合单价st + 12 = 综合合价
后续人材机、管理费、利润同理成对(步长亦为 12)。
数值有冗余副本(同值连续重复 2~3 次),扫描时用步长 4 再压缩连续重复最稳。校验(必做):综合合价 = 综合单价 × 工程量,应 100% 通过。
A 分部分项合价 A.1 甲供材料费
B 措施项目 B.1 安全生产措施费
C 其他项目 C.1 暂列金额 / C.2 专业工程暂估价 / C.3 计日工
C.4 总承包服务费 / C.5 合同约定的其他项目
D 税前建安工程造价 = A + B + C
E 增值税 = (D − A.1) × 9%
F 最高投标限价合计 = D − A.1 + E
两种定位方式,按序尝试:
分部分项合价 / 甲供材料费 / 通用措施项目合价+专业措施项目合价 /
安全生产措施费 / 其他项目合价 / 暂列金额 / 专业工程暂估价 /
A+B+C / (D-A.1)*费率 / D-A.1+Escripts/dbl3010.py。反解必须加的三条剪枝(不加会解出语义错误的组合):
A + B = D。脚本里的 MAP 默认为空(降级为"分册N",不臆造名称)。按此流程重建:
{版本}/Tree → 得到「单项工程 → 单位工程」层级与顺序01=建筑 / 03=安装 / 04=市政总平 / 05=其他0/1005 汇总表合计 字符串,取其后 double)。
全部分册应通过,差 ≤ 0.05 元(浮点舍入)。这是证明没漏项的决定性证据。A+B+C=D、(D−A.1)×9%=E、D−A.1+E=F,逐项通过。SysData 里第一个大写金额 = 项目总价)。⚠️ 常见误解:清单合价合计 ≠ 工程总额。 差额是措施费、规费、税金、暂列金额等,属正常造价构成,不是解析错误。 判断依据:每个分册 Σ合价是否与文件自己写的"合计"行一致。
unzip 解出的文件权限是 ----------,必须 chmod -R u+rw,否则读不了struct.unpack_from 要限 min(b, len(d))-8,否则越界报错sed 替换含 * 的模式会失败(zsh glob),改文件直接用 Python 读写生成的 Excel 统一:表头蓝底白字加粗、冻结首行、开启筛选、 金额千分位 2 位小数、层级行缩进+浅蓝底、合计行黄底红字。
依赖:openpyxl(Python 3.13 已装)。
注:本技能所有方法均在真实工程文件上实测验证过(12 个单位工程、 384+382 条清单,三层勾稽全部通过)。文档中的项目名与金额均做脱敏处理, 使用时请以自己文件的实际内容为准。