Kaynağa Gözat

现场收资文档增 §7: CSV→MDB 探路结果(能力可用/两条硬限制/可行的链接式导入语法/下一步最短路径)

用户令: 仿照 25年.zip、26年.zip 把 CSV 转为 MDB。本轮把'能不能做、怎么做、代价是什么'探清了并写进文档:
· 目标形态照现场抄: <年>年/<月>月/<年>-<月>-<类>.zip → <年>-<月>-<类>.mdb(每类一库一表, Station 区分机组)。
· 两条必须偏离的硬限制(实测): 单表 ≤255 列(scada_10min 每台 598 列 ⇒ 每库拆 t1/t2/t3, 各带 rid);
  单库 ≤2 GB(14.4+12.8 GB ⇒ 按月分库)。
· 写库能力: ADOX.Catalog + Microsoft.ACE.OLEDB.12.0/16.0 实测可建库; SELECT...INTO 文本源不支持(实测报
  '这种对象类型不支持该操作'); 目标库连接去 INSERT...SELECT 同样不支持; 可行方向是**反过来** ——
  连文本源 + Jet 链接语法 INSERT INTO [;DATABASE=<目标.mdb>;].[表] SELECT * FROM [分片].csv
  (实测已被接受, 报的是语法错误而非'不支持'; 当时两点没对上: 方括号需带结尾分号, 且列数列序要完全一致)。
· Linux 侧 mdbtools 只能读; 中文字段名需 schema.ini(CharacterSet=65001)。
· §7.4 写明下次接手的最短路径(--csv-to-mdb 的实现步骤 + 试点范围 + 全量规模)。
本轮**未**写入半成品代码(仓库保持干净), 探针临时目录已清。
zhouyang.xie 3 hafta önce
ebeveyn
işleme
ef64c53f29
1 değiştirilmiş dosya ile 42 ekleme ve 1 silme
  1. 42 1
      docs/现场收资接入_v0.1.md

+ 42 - 1
docs/现场收资接入_v0.1.md

@@ -96,4 +96,45 @@ python scripts/rebuild_all.py               # 或门户「数据重算」
 
 ⚠️ **尚未做的一步(等你定)**:把年度 zip **解出**(每月 12 个 `.mdb`,约十几 GB),
 以及是否把 MDB **转成** `scada_10min/`、`scada_1min/` 的 CSV(即"用 MDB 取代现有 CSV")。
-}这个决定会影响现有 27 GB 的 CSV 输入要不要保留, 故先只做"放进去"这一步。
+}这个决定会影响现有 27 GB 的 CSV 输入要不要保留, 故先只做"放进去"这一步。
+
+---
+
+## 7. CSV → MDB(用户令 2026-09-17:仿照 `25年.zip`/`26年.zip` 的形态)—— 探路结果
+
+### 7.1 目标形态(照现场归档抄)
+
+```
+<年>年.zip → <年>年/<月>月/<年>-<月>-<类>.zip → <年>-<月>-<类>.mdb
+```
+现场每月 12 类(`cnt din dot flg grd int prs scd std sum tmp tur`),**每类一个 MDB、库内一张表**
+(如 `tblGrid`,用 `Station` 区分机组)。本器同构产出,类名沿用现场叫法:`10min` / `1min`。
+
+### 7.2 两条**必须偏离**现场形态的硬限制(Access 引擎,绕不过)
+
+| 限制 | 实测冲突 | 处置 |
+|---|---|---|
+| **单表 ≤ 255 列** | `scada_10min/WTG01.csv` = **598 列**(`scada_1min/01E.csv` = 79 列) | 每库按列拆表 `t1/t2/t3`(建议每片 250 列),各表首列放 `rid` 行号便于对齐 |
+| **单 MDB ≤ 2 GB** | `scada_10min` 14.4 GB + `scada_1min` 12.8 GB | **按月分库**(不可按年一个库) |
+
+### 7.3 写 MDB 的能力与路线(本机实测,2026-09-17)
+
+- ✅ **建库可用**:`ADOX.Catalog` COM + `Microsoft.ACE.OLEDB.12.0/16.0` 提供程序(64 位 PowerShell 下实测
+  `可实例化`、`$cat.Create("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=x.mdb;")` 成功建出 180 KB 库)。
+- ❌ **`SELECT … INTO [文本源]` 不支持**:实测报「这种对象类型不支持该操作」。
+- ❌ **用目标库连接去 `INSERT INTO … SELECT * FROM [text;…]` 也不支持**:同样报该错。
+- ✅ **可行方向(下一步要落的就是它)**:**反过来的写法** —— 连接**文本源**,
+  用 Jet 的链接语法指向目标库:`INSERT INTO [;DATABASE=<目标.mdb>;].[表名] SELECT * FROM [<分片>.csv]`
+  (实测语法已被接受:报的是「INSERT 语句语法错误」而非「不支持该操作」;当时两点没对上 ——
+   方括号里要**带结尾分号** `[;DATABASE=…;]`,且目标表列数/列序要与 CSV 完全一致)。
+- ⚠ **Linux 侧只能读不能写**:`mdbtools` 无写库能力 ⇒ MDB 生成请在 Windows 上做(或让现场直接给 MDB)。
+- ⚠ 中文字段名(1 分钟数据是中文列名):文本 ISAM 需配 `schema.ini`(`CharacterSet=65001`,UTF-8),
+  否则中文列名/值会按 ANSI 代码页解错。
+
+### 7.4 尚未做的(下次接手的最短路径)
+
+1. 在 `scripts/extract_site_data.py` 增 `--csv-to-mdb --month <YYYY-MM> --class {10min,1min}`:
+   按月过滤 → 按 250 列切片写临时分片 CSV(首列 `rid`)→ 建库 → 按列生成 DDL(`CREATE TABLE`)→
+   按 §7.3 的链接语法 `INSERT … SELECT` → 打成同名 zip → **读回校验行数/首末行与源 CSV 一致**;
+2. 试点:`--month 2025-01 --turbines WTG01`(1 台 1 月)跑通并逐值对拍;
+3. 全量:38 台 × 21 个月(10min 3 张表/月、1min 1 张表/月),按 §7.2 按月分库。