1. 概述
1.1 應用場景
使用者 Windows 系統中有多個相同格式的 Excel 檔案,需要讀取所有檔案資料並進行 列轉欄 操作。
由於 檔案輸入 算子批量讀取檔案時,是將所有檔案資料上下合併,合併後的資料會存在重複值,列轉欄時會報錯(列轉欄算子中,要求「待列轉欄」的欄位名稱不能重複)。
1.2 實現思路
每次讀取一個 Excel 檔案,並對讀取後的資料進行處理,循環執行該程式,避免一次性讀取所有檔案,導致出現資料重複無法進行列轉欄操作問題。
注:本文方案適用於 4.0.29 及之後版本。
2. 操作步驟
2.1 準備工作
2.1.1 配置資料連結
1)由於我們需要透過執行 Bat 腳本獲取待掃描資料夾內的所有 Excel 的檔案名稱,在此之前,需要先配置 SSH 協定資料連結,遠端連結目標伺服器,便於執行遠端伺服器上的 Bat 腳本。
詳情請參見:配置SSH協定資料連結
2)Bat 腳本執行成功後,會在待掃描資料夾內生成一個excel_name.CSV檔案,內容為待掃描資料夾內的所有 Excel 的檔案名稱。
我們需要將檔案名稱匯出為參數,傳入「循環容器」節點,一個個讀取 Excel 檔案資料。匯出為參數前,需要先讀取excel_name.CSV檔案資料。
本文範例中,透過 伺服器本地目錄 資料連結讀取excel_name.CSV檔案資料。
2.1.2 待讀取檔案存放位置
待讀取 Excel 檔案範例:excel文件夹.zip
待讀取 Excel 檔案,本文範例存放在:FDL工程安裝地址\webapps\webroot\WEB-INF\assets\local_files\excel資料夾中。
待讀取 Excel 檔案資料如下圖所示:
2.2 Bat 腳本讀取所有 Excel 檔案名稱
本節透過運作 Bat 腳本,獲取所有要讀取的 Excel 檔案名稱。
2.2.1 Bat 腳本內容
Bat 腳本範例檔案:Bat脚本示例.zip
1)本文範例中,要讀取的 Excel 檔案儲存在FDL工程安裝地址\webapps\webroot\WEB-INF\assets\local_files\excel資料夾中,運作該 Bat 腳本後,將在該資料夾中生成一個excel_name.CSV檔案,內容為需掃描資料夾內的所有 Excel 的檔案名稱。
根據實際情況,修改下面程式碼中的路徑。
注:使用 GBK 編碼儲存。
SETLOCAL EnableDelayedExpansion
REM 啟動延遲環境變數擴展
SET "xls_path=E:\FDL-正式\tomcat-win64\webapps\webroot\WEB-INF\assets\local_files\excel資料夾\*.xls"
SET "xlsx_path=E:\FDL-正式\tomcat-win64\webapps\webroot\WEB-INF\assets\local_files\excel資料夾\*.xlsx"
REM xls_path\xlsx_path參數定義了需要掃描資料夾的地址和類型
SET "output_path=E:\FDL-正式\tomcat-win64\webapps\webroot\WEB-INF\assets\local_files\excel資料夾\excel_name.CSV"
REM output_path參數定義了匯出檔案的路徑和名稱
DIR "!xls_path!" "!xlsx_path!" /B /ON > "!output_path!"
REM /B參數是用來匯出檔案名稱,/ON參數是用來按檔案名稱排序。
2)將 Bat 檔案放到 Windows 中某個目錄下。
2.2.2 運作 Bat 檔案
1)建立定時任務,拖入「Bat腳本」節點,設定如下圖所示:
2)右鍵點選「Bat腳本」節點,運作該節點,獲取所有要讀取的 Excel 檔案名稱,便於後續將所有 Excel 名匯出為參數。如下圖所示:
3)運作成功後,FDL工程安裝地址\webapps\webroot\WEB-INF\assets\local_files\excel資料夾中自動生成一個excel_name.CSV檔案,內容為需掃描資料夾內的所有 Excel 的檔案名稱。如下圖所示:
2.3 將檔案名稱匯出為參數
1)拖入「參數指派」節點,讀取excel_name.CSV檔案資料。
編碼選擇 GBK ;由於excel_name.CSV檔案資料沒有欄位名稱,都是待讀取 Excel 檔案名稱,此處不勾選「起始行為欄位名」。
2)將待讀取的 Excel 名稱匯出為參數。如下圖所示:
2.4 刪除目標表
為便於後續定時讀取 Excel 檔案,拖入「SQL腳本」節點,循環讀取資料前,先刪除目標表;目標表在後續「循環容器」節點中再建立即可。如下圖所示:
注:本節刪除的表與 2.5.2 節「DB表匯出」算子中的資料去向表相同。
2.5 循環讀取 Excel 資料並對資料進行處理
將 2.3 節的參數傳遞給循環容器,循環容器可一次次循環來遍歷指派節點的匯出結果。
2.5.1 設定循環容器
「循環容器」節點設定如下圖所示:
2.5.2 資料處理
1)在「循環容器」節點內,拖入「資料轉換」節點,對每次讀取的資料進行處理。
2)進入「資料轉換」節點,拖入「檔案輸入」算子,讀取檔案資料。如下圖所示:
「檔案地址」處引用 2.3 節匯出的參數,手動輸入;本文範例中,「檔案地址」為:assets/local_files/excel資料夾/${aa}
注:在「檔案地址」中,貼上完整檔案地址或者手動輸入檔案地址後,按 Enter 鍵儲存。
3)根據實際情況,可在「檔案輸入」算子後接入其他資料處理算子,例如列欄轉換算子、欄位設定算子等,本文範例不展示此程式。
4)使用「DB表匯出」算子將本次讀取的資料匯出。如下圖所示:
寫入方式選擇「直接將資料寫入目標表」。
5)點選右上角「儲存」按鈕。
2.6 設定排程管理
點選「任務控制」,新增執行頻率。如下圖所示:
2.7 效果查看
點選右上角「儲存並運作」按鈕即可,運作成功後,wenjian 表資料如下圖所示:
3. 注意事項
若使用者需要循環多次讀取 CSV 檔案,可適當修改本文 2.2.1 節 Bat 腳本程式碼:
SETLOCAL EnableDelayedExpansion
REM 啟動延遲環境變數擴展
SET "csv_path=E:\FDL-正式\tomcat-win64\webapps\webroot\WEB-INF\assets\local_files\excel資料夾\*.csv"
REM csv_path 參數定義了需要掃描資料夾的地址和類型
SET "output_path=E:\FDL-正式\tomcat-win64\webapps\webroot\WEB-INF\assets\local_files\excel_name.CSV"
REM output_path參數定義了匯出檔案的路徑和名稱
DIR "!csv_path!" /B /ON > "!output_path!"
REM /B參數是用來匯出檔案名稱,/ON參數是用來按檔案名稱排序。
需注意,上述程式碼中,最終匯出的 excel_name 檔案是 CSV 格式,所以最終匯出的檔案路徑與待掃描的 CSV 檔案路徑需不同。
其餘步驟根據本文第二章,適當調整即可。