94 lines
2.5 KiB
Python
94 lines
2.5 KiB
Python
|
|
import csv
|
||
|
|
import yaml
|
||
|
|
import json
|
||
|
|
from collections import defaultdict
|
||
|
|
from pathlib import Path
|
||
|
|
|
||
|
|
|
||
|
|
CSV_PATH = "instruction/镜频指令抽取.csv"
|
||
|
|
YAML_OUT = "instruction/instruction_library.yaml"
|
||
|
|
JSON_OUT = "instruction/instruction_library.json"
|
||
|
|
|
||
|
|
|
||
|
|
def load_csv(path: str):
|
||
|
|
rows = []
|
||
|
|
with open(path, "r", encoding="utf-8", newline="") as f:
|
||
|
|
reader = csv.DictReader(f)
|
||
|
|
for r in reader:
|
||
|
|
rows.append(r)
|
||
|
|
return rows
|
||
|
|
|
||
|
|
|
||
|
|
def build_instruction_library(rows):
|
||
|
|
devices = defaultdict(lambda: {"index": None, "commands": []})
|
||
|
|
global_commands = []
|
||
|
|
|
||
|
|
for row in rows:
|
||
|
|
device = row["设备名称"].strip()
|
||
|
|
index = row["设备索引"].strip()
|
||
|
|
name = row["指令名称"].strip()
|
||
|
|
cmd_id = row["指令编号"].strip()
|
||
|
|
ret = row["返回值"].strip()
|
||
|
|
desc = row["指令描述"].strip()
|
||
|
|
role = row["指令角色"].strip()
|
||
|
|
|
||
|
|
# 指令类型转换
|
||
|
|
type_map = {
|
||
|
|
"构造函数": "constructor",
|
||
|
|
"普通指令": "normal",
|
||
|
|
"循环开始": "loop_begin",
|
||
|
|
"循环结束": "loop_end",
|
||
|
|
}
|
||
|
|
cmd_type = type_map.get(role, "normal")
|
||
|
|
|
||
|
|
cmd_obj = {
|
||
|
|
"name": name,
|
||
|
|
"id": cmd_id,
|
||
|
|
"return": ret if ret else "",
|
||
|
|
"description": desc,
|
||
|
|
"type": cmd_type
|
||
|
|
}
|
||
|
|
|
||
|
|
if device == "" or device is None:
|
||
|
|
# 无设备 → 全局指令
|
||
|
|
global_commands.append(cmd_obj)
|
||
|
|
else:
|
||
|
|
# 有设备 → 写入设备指令
|
||
|
|
if devices[device]["index"] is None:
|
||
|
|
devices[device]["index"] = int(index)
|
||
|
|
|
||
|
|
devices[device]["commands"].append(cmd_obj)
|
||
|
|
|
||
|
|
return {
|
||
|
|
"devices": devices,
|
||
|
|
"global_commands": global_commands
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
def save_yaml(data, path):
|
||
|
|
with open(path, "w", encoding="utf-8") as f:
|
||
|
|
yaml.dump(data, f, allow_unicode=True, sort_keys=False)
|
||
|
|
|
||
|
|
|
||
|
|
def save_json(data, path):
|
||
|
|
with open(path, "w", encoding="utf-8") as f:
|
||
|
|
json.dump(data, f, ensure_ascii=False, indent=2)
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
print("📥 Loading CSV...")
|
||
|
|
rows = load_csv(CSV_PATH)
|
||
|
|
|
||
|
|
print("🔧 Building instruction library...")
|
||
|
|
lib = build_instruction_library(rows)
|
||
|
|
|
||
|
|
print("💾 Saving YAML...")
|
||
|
|
save_yaml(lib, YAML_OUT)
|
||
|
|
|
||
|
|
print("💾 Saving JSON...")
|
||
|
|
save_json(lib, JSON_OUT)
|
||
|
|
|
||
|
|
print("\n🎉 Done! Instruction library generated:")
|
||
|
|
print(f" - YAML: {YAML_OUT}")
|
||
|
|
print(f" - JSON: {JSON_OUT}")
|