a. 使用 pdf2text (PDFMiner: Python PDF parser and analyzer)
# pdf2txt -t tag 105tainan.pdf > 105tainan.tag
114601市立仁德國小20101000114602市立文賢國小11000000114603市立長興國小00000000114604市立依仁國小
特徵:學校代碼,學校名稱,各類科缺額數量(共8個類科),並假設數量皆為個位數。
114601,市立仁德國小,20101000,114602,市立文賢國小,11000000,114603,市立長興國小,00000000,114604,市立依仁國小
正規表示式:
\d{6}: 6個數字
(|\-[A-Z]): 分校代碼可有-A,或無分校代碼
[^\w\d]+(小|校): 連續不是 alphabet 或 digit,最後一個字是「小」或「校」,這裡可以是中文校名
\d{1,1}: 只要一個數字
範例1:
# grep -oP "\d{6}(|\-[A-Z])[^\w\d]+(小|校)\d{1,1}" 105tainan.tag
213624市立石門國小1
213644-A漁光分校0
213626市立安順國小5
213627市立和順國小3
範例2:
# grep -oP "\d{6}(|\-[A-Z])[^\w\d]+(小|校)\d{2,2}" 105tainan.tag
213624市立石門國小10
213644-A漁光分校01
213626市立安順國小50
213627市立和順國小31
正規表示式:
[^0-9\-A-Z]+: 學校代碼
[0-9]*?([0-9])$: 取得最後一個數字,所以前面用「[0-9]*?」的 non-greedy 比對,最後擷取「([0-9])$」一個數字
範例:
# [前處理] | perl -pe 's|[^0-9\-A-Z]+[0-9]*?([0-9])$| \1|'
213624 1
213644-A 0
213626 5
213627 3
範例:
# [前處理] | grep -vP ' 0$'
213624 1
213626 5
213627 3
範例:
# [前處理] | awk '{print "\""$1"\" : "$2","}'
"213624" : 1,
"213641" : 3,
"213626" : 5,
完整 JSON 格式:
var t = {
"213624" : 1,
"213641" : 3,
"213626" : 5,
"" : 0
};
透過「台南市各級學校查詢 - 資料集 - 臺南市政府資料開放平台」,下載 JSON 檔案。 因為該資料是 Array 型式,不方便查詢。所以透過簡單程式轉換為 Hash (Associative Array),並簡化資料量。
部份資料錯誤,需自行更正(如:「東區大同國小」與「善化區大同國小」座標皆相同)。
# wget -q -O - http://odata.tn.edu.tw/schoolapi/api/getdata | ./json_conv.pl > schools.json
引用前處理過的兩份 JSON 資料,「缺額表」與「學校資訊」。
<!-- 105年缺額表 -->
<script type="text/javascript" src="../targets.json"></script>
<!-- 台南市政府開放資料 - 學校座標資料 -->
<script type="text/javascript" src="../schools.json"></script>
使用 Google Maps API 與 Marker Clusterer 繪製地圖。
資料來源:臺南市政府資料開放平台