40 lines
1.9 KiB
Markdown
40 lines
1.9 KiB
Markdown
# 中国机车图鉴 · 应用工程
|
||
|
||
对应 `2-task.md` 的实现代码。当前已完成 **Phase 0(部分)+ Phase 1A(数据底座 ETL)**。
|
||
|
||
## 目录结构
|
||
```
|
||
app/
|
||
etl/
|
||
field_dict.py # 统一字段字典、同义表头映射、枚举、分类配置 (T-1.1)
|
||
clean.py # 清洗规则:单元格清理、数值+单位拆分、年代/状态/国别 (T-1.2)
|
||
schema.sql # 三层模型 schema:Category/Model/Unit + 关系表 (T-1.1)
|
||
importer.py # ETL 主流程:12 CSV -> SQLite + JSON + 报告 (T-1.2)
|
||
tests/ # 单元/集成测试 (Jest 等价物,使用 Python unittest)
|
||
data/ # 产物:machines.db / machines.json / import_report.md
|
||
```
|
||
|
||
## 运行 ETL 导入
|
||
```bash
|
||
# 在 Train/ 目录下
|
||
python3 -m app.etl.importer
|
||
```
|
||
输入:`Train/csv/*.csv`(由总表 xlsx 转出的 12 张分类表)
|
||
输出:`app/data/machines.db`、`machines.json`、`import_report.md`
|
||
|
||
当前导入结果:**Model 540 / Unit 307**,跳过 10(均为空行),0 待复核。
|
||
|
||
## 运行测试
|
||
```bash
|
||
python3 -m unittest discover -s app/tests -p "test_*.py" -v
|
||
```
|
||
覆盖:字段映射、单位拆分、年代/状态解析、向前填充、表头识别、全量导入幂等性。
|
||
|
||
## 设计说明与已知取舍
|
||
- **存储**:开发期使用 SQLite(零依赖、可运行验证)。schema 按可移植到 PostgreSQL 设计,
|
||
Phase 1B 接入 API 时可平滑迁移(数值+单位字段、外键、索引均兼容)。
|
||
- **保真**:每条记录保留 `raw_json`,原始清洗后所有列不丢失,便于后续众包修订与字段补全。
|
||
- **复合数值**(如电力机车 "2×92(100)"):取首个数值入 `*_value`,完整原文存 `raw_json`,
|
||
待 Phase 2 众包修订细化。
|
||
- **国别属性**:当前用启发式默认"国产",字段已就位,等待圈层二(国外车型)数据与人工标注。
|