當有使用者提供EXCEL檔匯入自動產生ERP單據的需求的時候,就會需要與外部文件做互動(讀取外部文件的內容),這種時候就可以使用base.Channel系列的語法達成目的。
首先有一個EXCEL資料(已先轉成逗號分隔的.csv檔案),如下圖:
![[TIPTOP/T100] 使用base.Channel讀取 [TIPTOP/T100] 使用base.Channel讀取](https://pic.pimg.tw/sdiven1234/1695345764-3270093606-g.png)
這個excel檔共有兩筆資料(二列)、三個屬性(三欄)
(養成良好習慣,要求使用者將excel檔案存成逗號分隔的.csv檔,會為您在讀取資料時節省許多功夫,並且資料也不容易歪掉)
程式碼如下:
DATABASE ds
MAIN
DEFINE l_target STRING
DEFINE l_eof LIKE type_file.num10
DEFINE tok base.StringTokenizer
DEFINE l_channel base.Channel
DEFINE l_ch base.Channel
DEFINE l_cmd STRING
DEFINE l_content STRING
DEFINE li_cnt,l_i LIKE type_file.num10
DEFINE lr_data_tmp DYNAMIC ARRAY OF RECORD
data01,data02,data03 STRING
END RECORD
LET l_target = "/u1/toptest/tiptop/arthur/test.csv" #外部檔案路徑
LET l_cmd = l_target
LET l_ch = base.Channel.create() #建立新的Channel對象
CALL l_ch.setDelimiter("\n") #設定分隔符號,\n為換行符號的通用寫法
CALL l_ch.openFile(l_cmd,"r") #開啟與文件交換的Channel,並且只可唯獨
LET l_eof = l_ch.isEof() #文件末尾
LET li_cnt = 1
WHILE NOT l_eof
LET l_content = l_ch.readLine() #讀取整筆record(即一整列的資料)
LET tok = base.StringTokenizer.createExt(l_content,",","",TRUE) #建立token物件,使用,作為字串的分隔符號,若有NULL值則回傳NULL(這也是為何要求檔案要為.csv檔,因為可以直接用,去區分token)
WHILE tok.hasMoreTokens() #若可回傳token
LET lr_data_tmp[li_cnt].data01 = tok.nextToken() #將該筆record的第1個token寫入data01
LET lr_data_tmp[li_cnt].data02 = tok.nextToken() #將該筆record的第2個token寫入data02
LET lr_data_tmp[li_cnt].data03 = tok.nextToken() #將該筆record的第3個token寫入data03
END WHILE
LET li_cnt = li_cnt +1
LET l_eof = l_ch.isEof()
END WHILE
CALL l_ch.close() #channel用完後要關閉
#開始處理資料
FOR l_i = 1 TO lr_data_tmp.getLength()
DISPLAY lr_data_tmp[l_i].data01," ",lr_data_tmp[l_i].data02," ",lr_data_tmp[l_i].data03
END FOR
END MAIN
執行結果如下:
![[TIPTOP/T100] 使用base.Channel讀取 [TIPTOP/T100] 使用base.Channel讀取](https://pic.pimg.tw/sdiven1234/1695346082-1529368989-g_n.png)
詳細應用可參考:
請先 登入 以發表留言。