From 7a524be22a2e6c20d425884b19398676788e46e5 Mon Sep 17 00:00:00 2001 From: JSDurand Date: Mon, 19 Jul 2021 09:11:22 +0800 Subject: new: a function to calculate grades * csv-conf.el (calculate-grades): This calculates the grades according to the specifications of the professor. This is but a one-time function, but might be modified for other uses later. --- csv-conf.el | 135 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 csv-conf.el diff --git a/csv-conf.el b/csv-conf.el new file mode 100644 index 0000000..276d44f --- /dev/null +++ b/csv-conf.el @@ -0,0 +1,135 @@ +;;; csv-conf.el --- For dealing with CSV files -*- lexical-binding: t; -*- + +;; Copyright (C) 2021 李俊緯 + +;; Author: 李俊緯 +;; Keywords: convenience, tools + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; + +;;; Code: + +;;;###autoload +(defun calculate-grades () + "Return an alist of grades and number of repititions." + (interactive) + (let (grouped-ones field-start name grades temp-grades num1 num2 num3 current) + (with-current-buffer "all names.csv" + (goto-char (point-min)) + (forward-line 1) + (while (< (point) (point-max)) + (cond + ((save-excursion (goto-char (line-end-position)) + (thing-at-point 'number)) + (re-search-forward "," (line-end-position) t 4) + (setq field-start (point)) + (re-search-forward "," (line-end-position) t) + (setq grouped-ones + (cons + (cons + (upcase + (buffer-substring-no-properties + field-start (1- (point)))) + nil) + grouped-ones)))) + (forward-line 1))) + (with-current-buffer "b24189.csv" + (goto-char (point-min)) + (forward-line 1) + (while (< (point) (point-max)) + (re-search-forward "," (line-end-position) t) + (setq field-start (point)) + (re-search-forward "," (line-end-position) t) + (setq name (buffer-substring-no-properties + field-start (1- (point)))) + (re-search-forward "," (line-end-position) t 3) + (setq num1 (or (thing-at-point 'number) 0)) + (re-search-forward "," (line-end-position) t) + (setq num2 (or (thing-at-point 'number) 0)) + (re-search-forward "," (line-end-position) t) + (setq num3 (or (thing-at-point 'number) 0)) + (setq grades + (cons + (list name num1 num2 num3) + grades)) + (forward-line 1))) + (with-current-buffer "2021-07-02T1637_成績-代數導論二_(MATH2114).csv" + (goto-char (point-min)) + (forward-line 1) + (while (< (point) (point-max)) + (re-search-forward "([^)]*,[^)]*)" (line-end-position) t) + (re-search-forward "," (line-end-position) t 2) + (setq field-start (point)) + (re-search-forward "@" (line-end-position) t) + (setq name (buffer-substring-no-properties + field-start (1- (point)))) + (re-search-forward "," (line-end-position) t 2) + (setq num1 (or (thing-at-point 'number) 0)) + (re-search-forward "," (line-end-position) t) + (setq num2 (or (thing-at-point 'number) 0)) + (setq temp-grades + (cons + (append (list name) + (alist-get name grades nil nil #'string=) + (list num1 num2)) + temp-grades)) + (forward-line 1)) + (setq grades temp-grades) + (setq temp-grades nil)) + ;; Now grades has the form (name quizI quizII mid quizIII final) + ;; quizI is actually useless and should not have been collected. + (while (consp grades) + (setq current (car grades)) + (setq grades (cdr grades)) + ;; Three scores: + ;; 1. final + ;; 2. (final+mid)/2 + ;; 3. (final/2+mid*3/10+ (sum quizs) /10) + + ;; abuse the variable field-start to add extra scores + (setq name (car current)) + (setq field-start + (cond + ((assoc name grouped-ones #'string=) + (message name) + 7) + (0))) + (setq num1 (+ field-start (nth 5 current))) + (setq num2 + (+ field-start + (/ (+ (nth 3 current) + (nth 5 current)) + 2.0))) + (setq num3 + (+ field-start + (+ (/ (nth 5 current) 2.0) + (/ (* (nth 3 current) 3) + 10.0) + (/ (+ (nth 2 current) + (nth 4 current)) + 2.0)))) + (setq temp-grades + (cons + (list (car current) + (max num1 num2 num3) + num1 num2 num3) + temp-grades))) + temp-grades)) + +(provide 'csv-conf) +;;; csv-conf.el ends here -- cgit v1.2.3-18-g5258