1. 簡(jiǎn)介
1.1 問(wèn)題解釋
我比較喜歡Google Calendar作為我顯示課程的工具, 一到特定時(shí)間就會(huì)彈出通知框提醒我, 簡(jiǎn)單好用, 不像超級(jí)課程表那么多功能. 有Google Calendar這么強(qiáng)大的日歷為什么不使用呢.
一開(kāi)始我都是手工創(chuàng)建行程, 你需要填行程名字, 時(shí)間段, 地點(diǎn)... 如果是你的行程很少, 但是是會(huì)固定時(shí)間重復(fù), 例如每周周一都要做這么一件事, 你可以使用Google Calendar的重復(fù)時(shí)間, 重復(fù)多少次, 或者到某個(gè)日期停止.
但是對(duì)于大學(xué)課程就不是那么固定啦, 如果自己創(chuàng)建,還要打很多字, 還要去想一下重復(fù)多少次, 假如一門(mén)課是第8周到第10周的周一上的, 你就知道要重復(fù)三次, 但還有一個(gè)問(wèn)題是你要先知道第8周周一是幾月幾號(hào). 如果是要把一個(gè)學(xué)期的課程添加完也要十幾分鐘甚至是半個(gè)小時(shí). 而且我通常需要我現(xiàn)在已經(jīng)上到哪一周的課
1.2 Google Calendar提供的方法
Google Calendar的確提供了Calendar的API, 但是我還沒(méi)研究過(guò)怎么用, 以后可以考慮使用API
-
Google Calendar提供有導(dǎo)入日歷的功能(必須在網(wǎng)頁(yè)版才有), 是一種叫CVS格式的文件.
- 這種文件的格式就大概是說(shuō)以某些符號(hào)作為分隔符來(lái)分隔數(shù)據(jù)
-
Google Calendar的幫助頁(yè)面提到可以使用Google試算表(也可以使用LibreOffice的試算表, 我沒(méi)試過(guò)MS Office能不能導(dǎo)出cvs格式的)去生成我們的行程, 就是寫(xiě)成這個(gè)形式, Subject是行程的名字, Start Date是行程開(kāi)始日期, Start Time是開(kāi)始時(shí)間, End Date是結(jié)束日期, 如果那個(gè)行程是同一天的或, Start Date和End Date要填一樣的, Location是地點(diǎn)(我們用來(lái)保存上課地點(diǎn)好了, Description是描述(我用來(lái)描述我上到第幾周的課),還有Private字段還有All Day字段的, 表示這個(gè)行程是不是私人的和是不是全天活動(dòng).
Kazam_screenshot_00025.png
-
Subject,Start Date,Start Time,End Date,End Time,Location,Description 半導(dǎo)體集成電路,02/20/2017,08:30 AM,02/20/2017,10:05 AM,教1-314,第1周使用文本編輯器或者cat命令看一下, 原來(lái)是下面這樣的格式的. 但是Google Calendar幫助頁(yè)面上寫(xiě)著, 如果我們填寫(xiě)的信息是包含有逗號(hào)的, 那么應(yīng)該要用雙引號(hào)引起來(lái). 例如假如你的行程名是"上課,學(xué)習(xí)", 那么你是需要使用雙引號(hào)引起來(lái). 還有要注意的是中午12點(diǎn)應(yīng)該是12:00 PM而不是AM否則就變成凌晨了.
使用上面的方法是不錯(cuò), 但是不可能讓我手工輸入, 因此下面要去尋找數(shù)據(jù)導(dǎo)入
2. 開(kāi)工
2.1 在學(xué)校頁(yè)面找數(shù)據(jù)
當(dāng)我們登錄進(jìn)教務(wù)管理系統(tǒng)之后就可以查詢(xún)我們的所有課程信息

我使用的Chrome瀏覽器, 可能上面操作會(huì)有點(diǎn)不一樣
右鍵點(diǎn)擊一下---選擇View frame source, 就可以看到當(dāng)前網(wǎng)頁(yè)的源碼

上面那一段就是我們想要的數(shù)據(jù), 有課程名, 上課周數(shù), 上課時(shí)間, 上課地點(diǎn)...我們先把中括號(hào)里面的內(nèi)容復(fù)制到一個(gè)文件當(dāng)中
2.2 數(shù)據(jù)處理
{"kcmc":"半導(dǎo)體集成電路","kcbh":"TMP0352","jxbmc":"電子技術(shù)14(1),電子技術(shù)14(2)","kcrwdm":"1052044","jcdm2":"01,02","zcs":"15,9,19,18,17,16,14,13,12,11,10,8,7,6,5,4,3,2,1","xq":"1","jxcdmcs":"教1-314","teaxms":"教師名"},{"kcmc":"半導(dǎo)體集成電路","kcbh":"TMP0352","jxbmc":"電子技術(shù)14(1),電子技術(shù)14(2)","kcrwdm":"1052044","jcdm2":"01,02","zcs":"4,5,3,2,1","xq":"3","jxcdmcs":"教2-515","teaxms":"教師名"}
一開(kāi)始這一段都是一段文字, 可以先分成多行. 可以發(fā)現(xiàn)每一條課程記錄都是用大括號(hào)括起來(lái)的{}, 如果我們把"},"換成換行符就可以變成多行了, 把上面的文字保存到一個(gè)叫source文件中
# 將},換成換行符\n
sed -i 's/},/\n/g' source
{"kcmc":"半導(dǎo)體集成電路","kcbh":"TMP0352","jxbmc":"電子技術(shù)14(1),電子技術(shù)14(2)","kcrwdm":"1052044","jcdm2":"01,02","zcs":"15,9,19,18,17,16,14,13,12,11,10,8,7,6,5,4,3,2,1","xq":"1","jxcdmcs":"教1-314","teaxms":"教師名"
,{"kcmc":"半導(dǎo)體集成電路","kcbh":"TMP0352","jxbmc":"電子技術(shù)14(1),電子技術(shù)14(2)","kcrwdm":"1052044","jcdm2":"01,02","zcs":"4,5,3,2,1","xq":"3","jxcdmcs":"教2-515","teaxms":"教師名"
現(xiàn)在再將一些多余的字符串去掉
# 將開(kāi)頭的{"kcmc":"和,{"kcmc":"去掉
sed -i 's/.*{"kcmc":"http://g' source
半導(dǎo)體集成電路","kcbh":"TMP0352","jxbmc":"電子技術(shù)14(1),電子技術(shù)14(2)","kcrwdm":"1052044","jcdm2":"01,02","zcs":"15,9,19,18,17,16,14,13,12,11,10,8,7,6,5,4,3,2,1","xq":"1","jxcdmcs":"教1-314","teaxms":"教師名"
半導(dǎo)體集成電路","kcbh":"TMP0352","jxbmc":"電子技術(shù)14(1),電子技術(shù)14(2)","kcrwdm":"1052044","jcdm2":"01,02","zcs":"4,5,3,2,1","xq":"3","jxcdmcs":"教2-515","teaxms":"教師名"
然后把":"和","替換成空格
# 將":"和","替換成空格
sed -i 's/","/ /g' source
sed -i 's/":"/ /g' source
得到下面的形式
半導(dǎo)體集成電路 kcbh TMP0352 jxbmc 電子技術(shù)14(1),電子技術(shù)14(2) kcrwdm 1052044 jcdm2 01,02 zcs 15,9,19,18,17,16,14,13,12,11,10,8,7,6,5,4,3,2,1 xq 1 jxcdmcs 教1-314 teaxms 教師名"
半導(dǎo)體集成電路 kcbh TMP0352 jxbmc 電子技術(shù)14(1),電子技術(shù)14(2) kcrwdm 1052044 jcdm2 01,02 zcs 4,5,3,2,1 xq 3 jxcdmcs 教2-515 teaxms 教師名"
現(xiàn)在就會(huì)得到以空格分割的字段, 第一列是課程名稱(chēng)半導(dǎo)體集成電路, 第9列是上課的節(jié)數(shù)01,02, 第11列是上課的周數(shù)15,9,19,18,17,16,14,13,12,11,10,8,7,6,5,4,3,2,1, 第13列是星期幾上課, 第15列是上課地點(diǎn)
我通常就只需要這些信息
# 使用awk命令輸出我們需要的列
awk '{print $1" "$9" "$11" "$13" "$15}' source
# 命令行會(huì)輸出這樣的東西
半導(dǎo)體集成電路 01,02 15,9,19,18,17,16,14,13,12,11,10,8,7,6,5,4,3,2,1 1 教1-314
半導(dǎo)體集成電路 01,02 4,5,3,2,1 3 教2-515
# 使用重定向?qū)wk的輸出重定向到另外一個(gè)文件output
awk '{print $1" "$9" "$11" "$13" "$15}' source > output
現(xiàn)在寫(xiě)一個(gè)Java程序去讀取這個(gè)output文件里面的內(nèi)容并且裝換成Google Calendar支持的CSV格式
// MyDate.java
import java.util.Calendar;
import java.util.GregorianCalendar;
public class MyDate extends GregorianCalendar {
public MyDate(int year, int month, int date){
super(year, month-1, date);
}
/**
* 添加天數(shù)
* @param day
*/
public void addDay(int day) {
add(DAY_OF_MONTH, day);
}
/**
* 將日期輸出成02/21/2017的格式
*/
public String toString() {
return String.format("%02d/%02d/%04d", get(Calendar.MONTH) + 1, get(DAY_OF_MONTH), get(YEAR));
}
}
// Transfer.java
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class Transfer {
/**
* 將上課節(jié)數(shù)轉(zhuǎn)換成上課時(shí)間和下課時(shí)間
* 傳入的參數(shù)上課節(jié)數(shù)格式應(yīng)該是
* 01,02 早上一二節(jié)上課
* 06,07 下午6,7節(jié)上課
* 05 中午第5節(jié)上課
* 10,11,12晚修上三節(jié)課
* 01,02,03,04早上連續(xù)4節(jié)課
* @param time
* @return
*/
public static String[] toCourseTime(String time) {
String[] result = new String[2];
String[] times = time.split(",");
// 如果只上一節(jié)課, 那就是中午上第五節(jié)
if (times.length == 1) {
result[0] = "1:50 PM";
result[1] = "2:30 PM";
return result;
}
// 設(shè)置上課時(shí)間
switch (times[0]) {
case "01": times[0] = "8:30 AM"; break;
case "03": times[0] = "10:25 AM"; break;
case "06": times[0] = "2:40 PM"; break;
case "08": times[0] = "4:30 PM"; break;
case "10": times[0] = "6:30 PM"; break;
}
// 設(shè)置下課時(shí)間
switch (times[times.length-1]) {
case "02": times[1] = "10:05 AM"; break;
case "04": times[1] = "12:00 PM"; break;
case "07": times[1] = "4:15 PM"; break;
case "09": times[1] = "6:00 PM"; break;
case "12": times[1] = "9:00 PM"; break;
}
// 返回結(jié)果, 上課時(shí)間保存在resuit[0], 下課時(shí)間保存在result[1]
result[0] = times[0];
result[1] = times[1];
return result;
}
/**
* 傳入保存有形如下面課程信息的文件, 輸出CVS格式的文件
* 課程名稱(chēng) 上課節(jié)數(shù) 上課周數(shù) 星期機(jī)上課 上課地點(diǎn)
* 例如: 高等數(shù)學(xué) 01,02 1,2,3,4,5,6 5 教1-222
* @param inputFilePath 輸入文件路徑
* @param outputFilePath 輸出文件路徑
* @param year 第一周第一天的年份
* @param month 第一周第一天的月份
* @param day 第一周第一天的日期
* @throws IOException
*/
public void transferCVS(String inputFilePath, String outputFilePath, int year, int month, int day) throws IOException {
File inputFile = new File(inputFilePath);
File outputFile = new File(outputFilePath);
if (!outputFile.exists()) {
outputFile.createNewFile();
}
PrintWriter pw = new PrintWriter(new FileWriter(outputFile, true));
BufferedReader br = new BufferedReader(new FileReader(inputFile));
String line = null;
pw.println("Subject,Start Date,Start Time,End Date,End Time,Location,Description");
while ((line = br.readLine()) != null) {
// 課程信息數(shù)組
String[] courseInfo = line.split(" ");
// 課程名字
String courseName = courseInfo[0];
// 課程上課節(jié)數(shù)
String courseTime = courseInfo[1];
// 課程上課周數(shù)
String courseWeeks = courseInfo[2];
// 課程上課周數(shù)
String[] weeks = courseWeeks.split(",");
int courseDay = Integer.parseInt(courseInfo[3]);
String coursePosition = courseInfo[4];
for (String week: weeks) {
MyDate courseDate = new MyDate(year, month, day);
int weekNum = Integer.parseInt(week);
courseDate.addDay(((weekNum-1)*7 + courseDay-1));
String[] courseTimes = toCourseTime(courseTime);
System.out.println(courseName + "," + courseDate.toString() + "," + courseTimes[0] +
"," + courseDate.toString() + "," + courseTimes[1] +
"," + coursePosition + ",第" + week + "周");
pw.println(courseName + "," + courseDate.toString() + "," + courseTimes[0] +
"," + courseDate.toString() + "," + courseTimes[1] +
"," + coursePosition + ",第" + week + "周");
}
}
pw.flush();
pw.close();
}
public static void main(String[] args) throws IOException {
Transfer transfer = new Transfer();
transfer.transferCVS("/path/to/source", "/src/com/transfer/output.cvs", 2017, 2, 20);
}
}
運(yùn)行這個(gè)程序就去/path/to/目錄下讀取source文件, 然后轉(zhuǎn)換好后在/src/com/transfer/目錄下生成一個(gè)output.cvs文件, 然后導(dǎo)入到Google Calendar中就可以啦.
3. 導(dǎo)入后效果


4. 后續(xù)
我并不是太會(huì)使用Linux的工具, 也許上面根本就不需要使用到Java去寫(xiě)個(gè)程序, 但日后我會(huì)慢慢完善這個(gè)小程序, 讓它可以操作起來(lái)更方便.
開(kāi)源中國(guó)碼云項(xiàng)目托管地址
https://git.oschina.net/kristar/CourseToCalendar.git
