用途:针对用户自己的表格或业务数据导出回答业务问题,让每个数字可复现。不用于合并去重多个文件(用 csv-excel-merger),也不用于审查财务模型公式(用 spreadsheet-model-auditor)。
主要能力与流程:
- 先画像。运行 python3 scripts/profile.py path/to/*.csv path/to/book.xlsx --out sqa_out,读取 sqa_out/profile.md,报告表头、行数、候选键、重复键、各列类型与解析率、空值比例、去重数、极值、货币与时区线索、日期范围、内嵌合计/页脚行、隐藏行列、合并单元格及跨文件连接风险,并草拟数据字典。
- 固定指标定义。查 references/metric-definitions.md;不同定义给出实质差异时列出一至三个,选默认继续,不停等。仅在选择不可知且关键时才询问(如两个金额列哪个为真、无汇率时用哪种货币、无活动日期时"活跃"何意)。不得静默编造定义。
- 只用代码计算。写 JSON 步骤规范后运行 python3 scripts/ask.py spec.json --out sqa_out/q1。每步是一个基于前一步的 SQL 视图,类型有 clean、filter、join、dedupe、derive、aggregate。它会统计每步前后行数,连接增行(扇出)时失败、减行时告警,运行 assert_zero 断言,并写出 answer.md、query.sql、steps.json、rows_used.csv。所有源列按文本载入,用 to_num()、excel_date() 显式转换并断言无解析失败;排除内嵌合计行;连接前对查找表去重或先聚合多端;用 LEFT JOIN 并统计未匹配行;经显式汇率表换汇并断言每行有汇率;分日/周/月前转换到报告时区;比率用汇总分量重算,不平均行级比率。引擎为 DuckDB(pip install duckdb),无则回退 SQLite(无时区函数)。
- 核对。在规范中加入 reconcile,与导出自身合计行、用户引用数、未分组合计或第二条路径比对;不一致则答案不算就绪。
- 带证据块作答。先给数字与定义,再列来源、过滤、连接、核对、其他定义、注意事项、查询与用到的行。
编辑数据安全:先复制原件;只按唯一键和列名改目标单元格;用 python3 scripts/diff_edit.py original.csv edited.csv --key invoice_id --allow amount --rows INV-7 做前后差异,展示给用户;xlsx 用 openpyxl 改特定单元格以保留公式格式并同样差异比对。
测试:python3 tests/run_tests.py 重建固定样本并验证画像捕获陷阱、四个问题答案、未加防范的连接被捕获以及编辑差异。
限制:范围限于文件内数据问题;需要 DuckDB 方可使用时区函数;缺失事实暂未提供。