當有使用者提供EXCEL檔匯入自動產生ERP單據的需求的時候,就會需要與外部文件做互動(讀取外部文件的內容),這種時候就可以使用base.Channel系列的語法達成目的。

首先有一個EXCEL資料(已先轉成逗號分隔的.csv檔案),如下圖:

[TIPTOP/T100] 使用base.Channel讀取

這個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讀取

 

詳細應用可參考:

https://4js.com/online_documentation/fjs-fgl-2.50.02-manual-html/c_fgl_ClassStringTokenizer_hasMoreTokens.html

https://4js.com/online_documentation/fjs-fgl-3.00.05-manual-html/c_fgl_ClassStringTokenizer_nextToken.html

https://4js.com/online_documentation/fjs-fgl-3.00.05-manual-html/c_fgl_ClassStringTokenizer_createExt.html

創作者介紹
創作者 米血的小天地 的頭像
米血

米血的小天地

米血 發表在 痞客邦 留言(0) 人氣( 49 )