技能|展会同名消歧与文件名契约法
> 与知识库 05-技能库/技能|展会同名消歧与文件名契约法.md 一一对应(三处同步之一)。
适用场景
批量导入按文件名识别展会,但源文件名并不规整:编号位数不一(2 位/3 位)、有的缺 | 分隔符、不同展会用了同一个编号、同名展会分两期举办。
触发词
展会重名、同名消歧、文件名契约、parse_fname、编号撞号、展会名叫 02、类型判定
操作步骤
- 定契约:
^(\d{1,3})[::]\s*(.*?)\s*(?:[||]\s*(.+?))?-?人流量\.xlsx$——编号 2–3 位、分隔符|可选。 - 有
|:前段=日期区间,后段=展会名。 - 无
|:用日期片段正则\d{1,2}月\d{1,2}[日号]?从中间段剥掉日期得到展会名,再去掉尾部残留的--_—、,,日号与空白。绝不能退化成用编号当展会名(否则导入后展会名叫 "02"/"03")。 - 类型按父目录名判定,不靠文件名:目录名
会议→ type=会议,否则 展览。 - 分组键用「编号 + 展会名」:只用编号分组会被撞号坑(本次 016 同时是家博会与婚博会,被合成一个展、丢掉一个展的全部流水)。
- 同名消歧:建展会时若
(name, type)已存在,依次尝试原名(日期区间)→原名(消歧N),保证同期不同批的展会各自独立。日期区间优先取文件名里的,其次由该组日期推导M月D日-M月D日。 - 落库核对:展会数应与源文件分组数一致;发现少了就是被合并了。
注意边界
- 正则要
re.S,展会名里可能有换行(存量名里的换行符已在 V4.5.6 清洗过)。 - 展会名长度上限 100(
backend/api/shows.py::NAME_MAXLEN),超长会被截断或报错。 - 消歧后缀用全角括号
(),与正文里的全角标点风格一致。 - 每批导入后抽查 3–5 个展会名,确认没有 "02"/"03" 这类退化名。
反例避雷
| 反例 | 为什么错 | 正确做法 |
|---|---|---|
无 | 时退化成用编号当展会名 |
导入后展会名叫 "02"/"03" | 从中间段剥日期片段取真名 |
| 分组只用编号 | 撞号的两个展会被合成一个,丢掉一个展的全部流水 | 分组键改为 (编号, 展会名) |
| 同名展会直接复用已有记录 | 两期数据被合并 | 追加(日期区间)或(消歧N)后缀 |
| 类型靠文件名里的「会议/展览」关键字判 | 文件名常常不带,判定全错 | 按父目录名判定 |
| 正则只支持 2 位编号 | 3 位编号文件 unmatched | 编号写 {1,3} |
关联
- 总纲技能:
05-技能库/技能|安检数据导入与发版打包流程.md - 项目:
D:\安检系统(FastAPI + SQLite 按年分库 + PyInstaller/Inno Setup 桌面壳) - 代码位置:
backend/import_data.py的parse_fname/ensure_show
版本记录
| 版本 | 日期 | 变更 |
|---|---|---|
| v1.0.0 | 2026-09-29 | 首版实战固化(V4.5.7):修 3 个会议文件 unmatched、016 撞号合并、007 与 040 同名 CCEE 展合并三类问题 |