把二战师级编制表录进数据库,兵种和番号两列对不上

去年冬天想做一个小的战史查询工具,场景很简单:手头有一批公开出版物里抄下来的师级编制表,涉及 1939–1943 年若干步兵师的兵种构成和番号沿革,大约 400 多行,字段是师番号、所属军、兵种、装备名称、编制数、时间。目标是能按兵种和时间段筛。

第一步是把原始表格转成 CSV。这里就出问题了:原文里「步兵」「掷弹兵」「猎兵」在不同年份的同一张表里混用,番号又有「第 1 步兵师」和「1. Infanterie-Division」两种写法。我先做了一列 unit_raw 保留原文,再拆 unit_no 和 unit_type:

CREATE TABLE org (
  id INTEGER PRIMARY KEY,
  unit_raw TEXT NOT NULL,
  unit_no INTEGER,
  unit_type TEXT,
  arm TEXT,
  year INTEGER,
  strength INTEGER,
  source TEXT
);

拆分用 Python 正则,只匹配能确定的部分,剩下的一律留空:

import re
pat = re.compile(r'第?\s*(\d+)\s*(步兵|掷弹兵|猎兵|装甲|炮兵)师')
m = pat.search(raw)
if m:
    no, typ = int(m.group(1)), m.group(2)
else:
    no, typ = None, None

关键的取舍是:arm(兵种)和 unit_type(师的名号)我坚持分两列。原因是改名不等于改编制,1942 年一个师从「步兵」改称「掷弹兵」,兵种构成可能没动,也可能同时补了装备。合并成一列,后面按兵种统计就会把改名事件算成编制变化。代价是录入时每条要人工判一次,400 行我花了两个晚上,而且判错的概率不低。

哪里会失效:第一,番号有重复使用的情况,同一个数字在不同年份对应不同部队,只靠 unit_no 去 join 会串行,必须带上时间范围;第二,原始表格里有些行是「师部及直属队」,没有独立番号,我的正则直接漏掉,导致总数对不上,后来加了一张 org_aux 表单独放;第三,编制数在原文里有时是「约」,我按整数录了,做求和时误差会累积,这一点我没解决,只是加了 is_approx 标记。

现在这个库能按「某年某兵种下所有师」出列表,但跨年份的番号延续还得手工核对。想问的是:你们处理这类带改名的部队序列时,是给番号建一张随时间变化的主表,还是干脆用事件表记「某年某师改名」?

0
赞同度 100% · 0 条评论 · 5 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

还没有评论,写下第一条。