我是这样统计成绩的

神坑:班长实习去了,学委不会用 excel……净来坑副班长啊!

我没有教务导出的三年总成绩单,有的只是每年导员发的成绩单。三年三种样式,每年的人还不固定(大二又转来好多人)。

现在任务是,利用已有信息,将所有人的成绩汇总,形成一份三年的总成绩单,然后再算其他的东西。

大一的成绩是这样的(导员自己统计的成绩):

大一成绩截取

大二的成绩是这样的(正方教务系统导出的成绩):

大二成绩截取

大三的成绩是这样的(青果教务系统导出的成绩):

大三成绩截取

所以第一件事是,将大三的成绩 “横过来”。第一想法是只利用 excel,复制、选择性粘贴,勾选 “转置”,这样一个人的成绩就成了以前的样式了。但是还是不方便:全班 87 人,此操作得手工 87 遍,并且即使转过来了,也不好进行统计。

然后就想拿编程解决了……

网上找了一下,python 有专门的库来读写取 excel 和 csv 文件。这就好办了。

然后理一下思路:对于每个人,我需要保存他的全部成绩。不同的两个人之间,科目还不一样。那就这样:用一个 set 记录下当前所有已知的科目名称,输出的时候,要是某人没有修这门课,就输出个 “空”。

然后定义数据结构:

学号是唯一的,在三种样式的成绩单里面都出现了。那就把学号当作 key,做成一个字典。

对于每一个人,也再做一个字典吧:key 是课程名称,value 是分数。因为有些成绩单内看不出学分是多少,就不再定义学分的存储位置了,输出出来之后手动添加学分吧。

然后是如何实现的事情了:

对于大三的成绩:

打开 excel 文件,分别读出每一行。

对于每一行,提取出学号、姓名、科目、分数。

如果不存在这个人,那么在名单列表里加入这个人。

找到这个人,如果某个课不在 key 列表里,说明这个课是第一次出现。第一次出现的都是初修成绩~~存起来。如果前面出现过了,说明现在这个成绩要么是补考成绩,要么是重修成绩,不用保存。

对于大二、大一的成绩单,处理方法类似。不再详述。

输出的时候,因为实在看不懂如何写 xls 文件,就直接输出成了 csv 文件了。如果修了某门课,输出成绩,否则输出个 “空”。顺带着把科目排了一下序,学号排了一下序。但是!Python 里面字符串 “小” 的定义是什么啊!有电看不懂……

然后又发现,大二的成绩上面,科目后面有个方括号,里面写着学分。因为其他俩单子里面都得不到学分,只好把这个信息舍弃了。用正则表达式替换掉这个方括号即可。

完整代码在此:

grad1 函数用于统计导员自己统计的成绩
grad2 函数用于统计正方教务系统导出的成绩
grad3 函数用于统计青果教务系统导出的成绩
如有需要可以直接拿来用,稍加修改即可

最后费尽周折拿到了三年的导出成绩,都是大三的样式的,于是代码里面就只用了第三种的。

实测速度很可观(1 秒就出结果),也能满足我的需要了。

excel 有了,开始统计其他信息:

不及格的怎么快速找出来?选中所有数值区域,单元格样式,选 “自定义”,输入公式 “[红色][<60]"不及格"”,这样所有不及格的都会变为红色的 “不及格”。删除掉这些行。或者的,选择 “条件格式”-“小于”,输入 60,换一个样式,也是 OK 的。

加权成绩怎么办?有公式:“SUMPRODUCT”,或者直接可以做矩阵的点乘,但好像出错了……我是 Office2016。

然后是 “vlookup”:第一个参数是 “拿谁进行比较”,第二个参数是 “哪个范围的第一列里找”,第三个参数是 “如果查找到了,返回哪一列上的值”,第四个参数是 “是否启用模糊匹配”。注意 “只在第一列进行查找”,“去哪里查找” 相当于一个小表了。这个函数很方便,但是第一次用的话很纠结,尤其是那个范围的含义。自己体会一下,我说不清楚。哦还有一个他的孪生兄弟 “hlookup” 我没有用过。

唯一没有实现自动的是,校选课,我输入校选课的名字,后面自动查找这个人的分数,再自动去某个地方把学分取过来。因为校选课的表比较稀疏,就手动来了。人多的话必须得找自动的公式啊啊啊!

其他的就没什么了。

其实想吐槽一下 Office2016 太智能了……有些东西不应该自增的,它却自作主张来了个自增。还得一个一个手动改回来。

87 人,每个人 82 个数据,整整忙了一天。最后终于出结果了。

写在最后:教务系统害死人,以后绝对不做教育管理的东西!

发表评论

电子邮件地址不会被公开。 必填项已用*标注