next up previous contents
Next: 使用 grep 讀取 XML Up: 匯入優化 Previous: XML 資料   Contents

XML 資料讀取

  1. 建立抽取標籤內資料的函式,使用 more +n 從第 n 讀取資料。
    function extract() {
        key=$(more "+${beg}" $1|grep -m1 "<$2>" | sed  "s/.*<$2>\(.*\)<\/$2>.*/\1/")
        key=$(echo "$key" | grep -o "[^ ]\+\( \+[^ ]\+\)*")
    }
    
  2. 計算總共有幾筆選課資料,記下每一筆資料在 XML 檔中的行號,以做為讀取的起點。
    arra=($(cat -n $1 | egrep '<(choose|noregister|stop)>' | awk '{print $1}'))
    if ! num=$(echo "$4" | grep '^[1-9][0-9]*$') ; then
        num=${#arra[@]}
    fi
    arra=(${arra[@]} $(cat $1| wc -l))
    
  3. 以迴圈逐一讀取資料。
    for ((i=0;i<$num;i++)); do
        beg=${arra[$i]}
        extract $1 crs_key; contextid=$key; id=$key
        extract $1 stuid; username="s$key";lastname=$key
        extract $1 scr_kind; scr_kind=$key
        scr_kind=$(echo $scr_kind| tr a-z A-Z)
        extract $1 crs_no; crs_no=$key
    done
    
  4. 使用此方式的優點在於,當 XML 檔次標籤順序變動或增減都不用更動程式。
  5. 此方式雖比之前直接以 cat 讀取資料快很多(從幾十小時降至約 7 小時),但腳本背景執行時,可能因為記憶體釋放的問題,造成匯入不正常。



2017-08-04