求教, Excel 存储的题库,怎么快速生成题本和解析

2022-08-03 16:16:04 +08:00
 tangbj
题库目前是用 Excel 存储,有选择题,判断题,复合题,数据 10 万条左右,要根据筛选条件,比如根据年份、根据难度等等,生成出一份题本,一份解析,要包含目录。
目前是用 RPA ,根据 Mardown 语法逐行输出文本,然后转成 PDF ,效率太低了,3000 道题目,要花费 1 小时,问问大家有更方便的方法吗?
2029 次点击
所在节点    程序员
21 条回复
wxf666
2022-08-03 16:29:00 +08:00
咋觉得放进数据库里( SQLite 都行),写个小脚本,几秒钟都生成好了呢
buliugu
2022-08-03 16:32:54 +08:00
存储换到数据库,多线程读取然后合并再生成 pdf 。这个步骤可以做成任务队列一直运行
wxf666
2022-08-03 16:50:13 +08:00
@buliugu 3000 题,用不上多线程吧。。

就算数据库 B+树 3 层,3000 题每题都在不同页上,最差也就随机读 6000 页而已(第一层 root 页被缓存)

对于 SQLite 4K 一页,也就随机读 6000 次 4K

现在随便一个固态 4K 的 IOPS 都几万几十万了吧


实在不行,丢 RamDisk 呗,每题 1KB ,10W 数据大概也就占 100MB 内存吧

不想用 RamDisk ,SQLite 也有读取整个数据库文件至内存的选项
tangbj
2022-08-03 17:11:45 +08:00
@wxf666 请问具体用什么编程语言呢?算是比小白好一丢丢,能找一些现成的源码修改。对了,有的题目是有图片的,excel 存了路径,导进数据库也同样用路径吗?
wxf666
2022-08-03 17:25:40 +08:00
@tangbj 个人觉得,python 干这活儿会很快

有点怀疑,你这场景这么具体,真的能找到现成源码么。。

把路径当字符串存进数据库,很正常啊


我觉得,你放点数据出来,可能有人看着简单,顺手帮你写了代码也说不定
GodThemselves
2022-08-03 17:43:13 +08:00
最近刚整过一个 excel 转 word 的 python 脚本,excel 中的列头+行数据转换为 word 里的一个段落。目前不知道你这个不同的题型是怎么存的,可能会麻烦点。
wxf666
2022-08-03 18:00:58 +08:00
@GodThemselves 看起来,要写的 python 代码只需输出 markdown ,

后续是由楼主的 markdown 转 pdf 工具来完成余下的工作(估计有自定义的 css ?),

这就很舒服啦~
tangbj
2022-08-03 18:49:51 +08:00
@GodThemselves [腾讯文档] 题库演示数据
https://docs.qq.com/sheet/DRld4ck1Ec09oV0FF
四种题型里的三种,还有复合题没想好怎么存,还没做清洗。
生成的文档只要有目录就行,格式也没有特殊要求,最终目的就是生成 PDF
Vegetable
2022-08-03 19:11:06 +08:00
。。。。这个啊,这个用 Word 配合邮件合并就行了
Vegetable
2022-08-03 19:15:50 +08:00
tangbj
2022-08-03 19:17:37 +08:00
@Vegetable 请问一下图片怎么适配呢?有的题目是图片,解析里也会有图片
Vegetable
2022-08-03 19:20:49 +08:00
Vegetable
2022-08-03 19:23:01 +08:00
@tangbj 还有图片啊,有点复杂了

https://jingyan.baidu.com/article/597035528f205c8fc0074019.html

也有教程,不过这么搞邮件合并就不是特别合适了,可能不好区分图片还是文字了
akira
2022-08-03 23:49:22 +08:00
感觉瓶颈是在 pdf 渲染 这里吧。 一秒渲染出一个 pdf 文件,差不多了啦。
krixaar
2022-08-04 08:44:02 +08:00
直接读 excel 排个序然后 python-docx 一行一行写就行了啊,add_paragraph 加一段落,add_picture 加一张图,出一个 docx 之后再转 pdf 难度就不大了吧?
GodThemselves
2022-08-04 10:24:52 +08:00
@tangbj
传到 git 上了,具体可能你得按你的需求再调一调
https://github.com/SHHK0976/excel_2_word
tangbj
2022-08-04 15:13:13 +08:00
@GodThemselves 感谢老哥
wxf666
2022-08-04 16:48:54 +08:00
@GodThemselves 看起来,你的源码和 @tangbj 的需求还有距离,比如:『要根据筛选条件,比如根据年份、根据难度等』、要包含目录』…… @tangbj 真要改起来,估计要学不少东西……

有可能做成一个 word 模板,python 按需填入吗?这样改起来方便,也能先用 word 自定义样式了


比如,『问题模板.docx 』:


(标题一样式,居中){{ 分类 3 }}

{{ for 问题 in problems }}

<word 的编号列表>({{ 问题.题型 }}){{ 问题.题目 }}

{{ if 问题.题图 is not None }}
{{ docx.添加图片(问题.题图) }}
{{ end }}

  A.{{ 问题.A }}
  B.{{ 问题.B }}
{{ if 问题.题型 != '判断题' }}
  C.{{ 问题.C }}
  D.{{ 问题.D }}
{{ end }}

{{ next }}



『答案模板.docx 』:


(标题一样式,居中){{ 分类 3 }}

{{ for 问题 in problems }}

<word 的编号列表>正确答案:{{ 问题.正确答案 }}   {{ 问题.年份 }}   {{ 问题.考点 }}

{{ 问题.解析 }}

{{ if 问题.解析图 is not None }}
{{ docx.添加图片(问题.解析图) }}
{{ end }}

{{ next }}
GodThemselves
2022-08-04 16:53:29 +08:00
@wxf666 献丑了,我和 OP 一样是个初学者。

@tangbj 的需求比较复杂,有多种题型和筛选方式,或许可以先用 excel 整理一遍分成子 sheets 再进行操作。
目录这块,我这个是可以实现的,因为用 python-docx 给定了标题样式,生成 word 以后可以直接通过 word 生成目录。
wxf666
2022-08-04 17:15:06 +08:00
@GodThemselves 文档生成这块,我也没啥经验

刚搜了搜,python 居然没有多少操控 markdown 的,几乎全是 markdown 转 html 的。。

虽说按楼主要求直接生成 markdown 很容易(还要处理下转义):

for index, pro in enumerate(problems):
  fp.write(f'{index + 1}.({pro.题型}){pro.题目}\n')
  if pro.题图:
   fp.write(f'![]({pro.题图})\n')
  for j, choice in enumerate(filter(None, (pro.A, pro.B, pro.C, pro.D))):
   fp.write(…)

但通用性太差了,专为楼主需求定制,没长进多少经验……

我自己的话,若想答,总想能干的更通用些,答案以后也更可能有用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/870445

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX