在幫朋友處理一份公文,公文的內容大要大致上是
“「國小校務行政系統」系統資料戲進行學年升級作業乙案”
然後這個資料庫可以從各校建康中心之教育部版(萬豐版)建康系統匯出方式取得.
這個建康系統是匯出 Excel File . 再由這個 Excel File 轉成 .csv
這個全誼公司要的資料格式是
“學號,姓名,性別,年級,班級,座號,生日,身份證字號,父親姓名,母親姓名,戶籍電話,戶籍住址,連絡電話,連絡住址,監護人姓名,監護人關係 ”
然而萬豐版的格式是
“代號,姓名,性別,入學年,班級,座號,生日(西元),身份證字號,父親姓名,母親姓名,郵遞區號,電話,住址(不含縣市?鎮),緊急聯絡方式,”
光是格式就不一樣了嘛,公文上說還從萬豐版的建康系統匯出可以取得,
到時候他們一定轉檔轉到死.
而萬豐版的系統寫得非常之爛
(1) 轉出的 Excel 檔,性別有時是 “男、女”, 有時是 “1,2” 搞什麼
(2) 沒有資料也會有輸出
(3) 就算輸出了, rb 也不一定會處理好
(4) 還會有輸出錯誤的資料格式.
然後我就用 php 寫了一個小小的轉檔程式, 將萬豐版改成全誼版. 這個程式叫 tran.php
開檔的地方就寫輸入的 csv file.
到時候 php tran.php > 001.csv 就可以得到你要的結果
02.csv 是你要輸入的檔案,改成你自己從萬豐版輸出的 .csv file
記得轉完以後,要手動看一下有沒有問題. 原來的 .csv 問題就很多
所以不確定各校是不是一樣.
source code 如下.
$fd = fopen("02.csv","r");
if($fd == "") exit();
$buf = fgets($fd,1024);
$ary = split(",",$buf);
// 輸出正確的檔頭
$buf =sprintf("%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s",
"學號",$ary[1],$ary[2],"年級",
$ary[4],$ary[5],"生日",$ary[7],
$ary[8],$ary[9],"戶籍電話","戶籍住址",
"連絡電話","連絡住址","監護人姓名","監護人關係");
echo "$buf rn";
while(!feof($fd)){
$buf = fgets($fd,1024);
$ary = split(",",$buf);
if($ary[1] == "") continue;
// 若是有輸出到第 14 欄的, 重新 arrange 一次
if(trim($ary[14]) != ""){
$mat[13] = $mat[13]." ".$mat[14];
echo $mat[13]."n";
}
// 將匯出學生資料中錯誤的性別轉成正確的
switch($ary[2]){
case 1:
$ary[2] = "男";
break;
case 2:
$ary[2] = "女";
break;
default:
break;
}
// 監護人判斷
if($ary[8] != ""){
$ary[15] = $ary[8];
if($ary[2] == "男")
$ary[16] = "父子";
else
$ary[16] = "父女";
}else if($ary[9] != ""){
$ary[15] = $ary[9];
if($ary[2] == "男")
$ary[16] = "母子";
else
$ary[16] = "母女";
}else{
echo "學號: $ary[1] 監護人不存在,請注意 n";
}
// 更正年級
$ary[3] = (94-$ary[3]);
if($ary[3] > 6 || $ary[3] < 1 ){
echo "年級有問題,請更正";
}
// 更正連絡方式,若沒有緊急連絡電話,則用電話代替
if($ary[13] == "") $ary[13] = $ary[11];
// 輸出正確的學號
$buf1 =sprintf("%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s",
$ary[0],$ary[1],$ary[2],$ary[3],$ary[4],$ary[5],
$ary[6],$ary[7],$ary[8],$ary[9],$ary[11],
$ary[12],trim($ary[13]),$ary[12],$ary[15],$ary[16]);
echo "$buf1 rn";
}
>>
taco
用fgetcsv處理csv檔會穩當一點
要不然碰到oo,”ooxx,ooo”,xx這種格式照你寫的會誤判喔XD