2026_1-15志愿导入经验说明.md 7.6 KB

2026 年 1-15 志愿分数线导入经验说明

本文用于明年继续处理上海中考 1-15志愿 分数线时快速上手。

目标和表

  • 数据库表:kylx365_db.MPS_Score
  • 年份:ScoreYear = 2026
  • 类型:ScoreType = 1-15志愿
  • 关键字段:DistrictIDSchoolTargetSchoolFullNameSchoolTargetRemarkPlanNumScoreTotalScore1Score2Score3Score4ScoreTotalDifferenceValue
  • 2026 最终库内总量:16 个区,961 行,重复 key 为 0

目录

源文件目录:

/Volumes/程杰外接SD盘/上海中考招生计划/2026/分数线/1-15志愿

计划文件目录:

/Volumes/程杰外接SD盘/上海中考招生计划/2026/计划/1-15志愿

工作目录:

/Users/chengjie/Documents/git/miaoguo_system_server/秒过分数线数据导入

主要脚本

  • import_mps_score_1_15_batch_from_json_2026.js
    • 通用 JSON 导入器,按学校名和备注匹配数据库计划行。
    • 适合文字层 PDF、HTML、MHTML、已人工/OCR 整理后的 JSON。
  • import_mps_score_1_15_xuhui_scores_2026.js
    • 徐汇专用,因源 PDF 是扫描图,最终按 3 页 PDF 手工核准。
  • import_mps_score_1_15_baoshan_scores_2026.js
    • 宝山专用,处理大量总分-only 行。
  • import_mps_score_1_15_pudong_scores_2026.js
    • 浦东专用,处理多页大表和 1 条库有源无计划行。
  • audit_mps_score_1_15_2026_final.js
    • 最终抽样审计脚本:比对源报告和数据库、查重复 key、生成高风险抽样清单。
  • generate_mps_score_1_15_2026_full_review_report.js
    • 汇总数据库、最新干跑报告、计划交叉核查报告,重写全量复查报告。
  • fix_mps_score_1_15_2026_missing_plan_rows.js
    • 专门处理“分数线有、计划图也有、数据库缺计划行”的补库脚本;2026 已补松江区上海创艺高级中学 1 行。
  • ocr_image_text.swift
    • macOS Vision OCR 辅助脚本,用于截图/JPEG/扫描 PDF 的文字识别。

2026 源文件处理方式

最终依据 说明
黄浦 黄浦区.pdf 文字层 PDF,67 行;PDF 无综合测试列,Score4 保持空。
徐汇 徐汇区.pdf 扫描 PDF,3 页;曾漏第 3 页,已补齐 68 行。
长宁 长宁区.pdf 文字层 PDF,57 行;库内另有新纪元计划行,源 PDF 未列,保留 0 分。
静安 静安区-本区.pdf + 静安区-外区.pdf 源有宋庆龄、博华、新纪元 3 行库无;已查计划图 静安区2.png 未见,不补库,列入源/计划不一致复查。库有新和停招,按停招保留。
普陀 普陀区.pdf 文字层 PDF,68 行。
虹口 虹口区.mhtml MHTML 表格,使用简称映射到数据库全称,50 行。
杨浦 杨浦区.html 源有 复旦大学第二附属中学,已查 杨浦区1.png + 杨浦区2.png 未见计划,不补库,列入源/计划不一致复查。
闵行 闵行区.pdf 文字层 PDF,80 行;5 行只公布总分。
宝山 宝山区.pdf PDF 2 页,59 行;17 行只公布总分。
嘉定 嘉定区.pdf 文字层 PDF,54 行;33 行只公布总分。
浦东 浦东新区.pdf PDF 3 页,106 源行;库内另有川沙中学北校,源未列,保留 0 分。
金山 金山区.pdf 源 40 行,库 42 行;2 条库有源无,列入复查。
松江 松江区.mhtml 源 58 行,匹配 56;计划图确认上海创艺高级中学有 2 个计划,已补入数据库 ID 40207。宝山世外、远东在计划图未见,不补库;5 条库有源无按未投档保留。
青浦 青浦区.html HTML 54 行;当前 HTML 已复核,changed_rows=0。
奉贤 奉贤区.html HTML 46 行。
崇明 崇明区1.jpeg JPEG 单图,29 行;低分段已人工视觉确认。

数据约定

  • ScoreTotal 为录取最低分。
  • Score1 为语数外总分。
  • Score2 为数学。
  • Score3 为语文。
  • Score4 为综合测试。
  • 源文件只有总分、没有末位考生分项时:录入 ScoreTotalScore1Score4 留空。
  • 源文件为 /、无考生达线、线上无人投档、控分线上无考生录取时:录入 ScoreTotal = 0,分项通常为 0。
  • PDF 没有综合测试列时不要补猜,例如黄浦区 Score4 留空。
  • ScoreTotalDifferenceValue 用当前总分减上一年同 key 总分;无考生/0 分行建议保持空,避免出现误导性的负差。
  • 有计划但分数线源未列,是正常未投档/无学生报入,库内计划行保留 0 分,不算错误。
  • 分数线源有但数据库没有计划行时,必须查计划图:计划图有才补库,计划图未见则列为源文件/计划文件不一致复查,不要强行补到数据库。

推荐流程

  1. 先确认当前库里 2026 年计划行是否已建好:
SELECT DistrictID, COUNT(*), SUM(PlanNum)
FROM MPS_Score
WHERE ScoreYear = 2026 AND ScoreType = '1-15志愿'
GROUP BY DistrictID
ORDER BY DistrictID;
  1. 对源文件分类:
    • 文字层 PDF:优先用 pdfplumber.extract_tables()
    • HTML/MHTML:用 HTML parser 抽 <table>
    • 扫描 PDF/JPEG/PNG:先 pdftoppm 渲染,再用 Vision OCR 和人工视觉核对。
  2. 抽成统一 JSON,字段用 schoolNamescoreTotalscore1score2score3score4officialRemark
  3. 先干跑:
node import_mps_score_1_15_batch_from_json_2026.js --input=输入.json --dry-run
  1. 确认 problem_rowsnot_in_source_rows

    • not_in_source_rows:库有计划、分数线源未列,通常是未投档,保留。
    • problem_rows / missing_current_row:先查计划目录。计划图有则补库,计划图未见则记报告。
  2. 正式导入:

node import_mps_score_1_15_batch_from_json_2026.js --input=输入.json
  1. 跑最终审计和全量报告:
node generate_mps_score_1_15_2026_full_review_report.js
node audit_mps_score_1_15_2026_final.js
node generate_mps_score_1_15_2026_full_review_report.js

常见坑

  • 官方源可能后续更新格式,目录里后来的 PDF/HTML 要优先于早期截图。
  • 学校名带括号时,数据库可能拆在 SchoolTargetRemark,例如艺术班、英语等。
  • 虹口 MHTML 使用简称,要先映射到数据库全称。
  • 静安、杨浦、松江等可能出现源文件有学校但计划库无对应行,不能强行写到别的学校;先用计划图核实。
  • 低分段常被误判为 OCR 错误,必须看源图:2026 年宝山民一综合 59、崇明民一数学 40 都是真值。
  • /未录满 不总是等于 0;有些区会写总分 501 且无分项,这应作为总分-only,而不是 0。

2026 已知待复查清单

最终详细清单见:

  • mps_score_1_15_2026_full_review_report.json
  • mps_score_1_15_2026_full_review_report.md
  • mps_score_1_15_2026_sample_audit_report.json
  • mps_score_1_15_2026_sample_audit_report.md

重点仍是源文件和计划文件不一致。库有源无按未投档保留,不再作为错误:

  • 静安:源有宋庆龄、博华、新纪元,计划图未见,库无。
  • 杨浦:源有 复旦大学第二附属中学,计划图未见,库无。
  • 松江:源有宝山世外、远东,计划图未见,库无。
  • 松江:源有创艺且计划图有 2 个计划,已补入库,不再是问题。
  • 长宁、浦东、金山、松江的库有源无行:有计划但分数线未列,按未投档保留 0 分。

清理原则

  • 保留导入脚本、最终源 JSON、最终审计报告和本经验说明。
  • 可删除 *backup*.jsontmp/tmp_*.pngtmp_*.json__pycache__/
  • 清理前先确认不再需要回滚数据库;备份文件只用于当次导入回滚。