90 lines
3.3 KiB
Python
90 lines
3.3 KiB
Python
import json
|
|
from bcl_calculator import BCLDataSourceItem
|
|
|
|
|
|
def process_project_data(json_data):
|
|
"""
|
|
处理 projectData 中的线路特征段数据,计算每条 bpBillZhXsTable 记录的加权值,
|
|
并返回一个字典列表,每个字典包含 '特征段' 和对应的 ItemName: 计算结果。
|
|
|
|
:param json_data: 解析后的 JSON 数据(字典格式)
|
|
:return: 字典列表,例如 [{"特征段": "1", "工地运输...": "21.8"}, ...]
|
|
"""
|
|
result_list = []
|
|
|
|
# 遍历每个线路特征段
|
|
for segment in json_data.get("projectData", {}).get("线路特征段", []):
|
|
seg_name = segment.get("Name", "")
|
|
# 提取特征段中的数字,例如 "特征段1" -> "1"
|
|
seg_number = "".join(filter(str.isdigit, seg_name))
|
|
if not seg_number:
|
|
seg_number = "0" # 默认值
|
|
|
|
# 获取 bpBillZhXsTable 列表
|
|
table_list = segment.get("bpBillZhXsTable", [])
|
|
for item in table_list:
|
|
try:
|
|
# 提取字段并转换为浮点数
|
|
KnapScale = float(item.get("KnapScale", 0))
|
|
Knap = float(item.get("Knap", 0))
|
|
HillScale = float(item.get("HillScale", 0))
|
|
Hill = float(item.get("Hill", 0))
|
|
EdelweissScale = float(item.get("EdelweissScale", 0))
|
|
edelweiss = float(item.get("edelweiss", 0))
|
|
MountainScale = float(item.get("MountainScale", 0))
|
|
Mountain = float(item.get("Mountain", 0))
|
|
SloughScale = float(item.get("SloughScale", 0))
|
|
Slough = float(item.get("Slough", 0))
|
|
RiverScale = float(item.get("RiverScale", 0))
|
|
River = float(item.get("River", 0))
|
|
DesertScale = float(item.get("DesertScale", 0))
|
|
Desert = float(item.get("Desert", 0))
|
|
|
|
# 执行计算
|
|
total = (
|
|
(KnapScale * Knap)
|
|
+ (HillScale * Hill)
|
|
+ (EdelweissScale * edelweiss)
|
|
+ (MountainScale * Mountain)
|
|
+ (SloughScale * Slough)
|
|
+ (RiverScale * River)
|
|
+ (DesertScale * Desert)
|
|
) * 0.01
|
|
|
|
# 保留一位小数,格式化为字符串
|
|
calculated_value = f"{total:.1f}"
|
|
|
|
# 获取 ItemName
|
|
item_name = item.get("ItemName", "未知项目")
|
|
|
|
# 构建结果字典
|
|
item_dict = {"特征段": seg_number, item_name: calculated_value}
|
|
|
|
# 添加到结果列表
|
|
result_list.append(item_dict)
|
|
|
|
except (ValueError, TypeError) as e:
|
|
print(f"数据转换错误,跳过该项: {e}")
|
|
continue
|
|
|
|
return result_list
|
|
|
|
|
|
# ============ 使用示例 ============
|
|
|
|
# 假设你已经通过 json.loads() 解析了你的 JSON 字符串
|
|
import json
|
|
|
|
# 正确读取 JSON 文件的方式
|
|
with open("测试案例/主网预算线路.json", "r", encoding="utf-8") as file:
|
|
data = json.load(file)
|
|
|
|
# 调用函数处理数据
|
|
processed_data = process_project_data(data)
|
|
|
|
# 现在 processed_data 是一个字典列表,你可以用它来创建 BCLDataSourceItem
|
|
DXITEM = [BCLDataSourceItem(item) for item in processed_data]
|
|
|
|
print(processed_data)
|
|
print(DXITEM)
|