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 文件路径需不同。
其余步骤根据本文第二章,适当调整即可。