首页 > 代码库 > 笔记:浅谈 ETL(SSIS) 对 EXCEL源的处理

笔记:浅谈 ETL(SSIS) 对 EXCEL源的处理

 

最近工作中刚好碰到excel 作为源导入db的需求,于是写下来帮助自己以后回顾和总结

逐步扩展对excel的处理

1.单纯的excel导入目标库

 这步实现是最为简单,不考虑任何的扩展性和容错处理,缺点也很明显,源文件名和文件所在的路径都需要固定并且无法处理一个批次多个文件的情况

2.扩展循环处理多个文件

这种实现在上一种基础上添加了一层循环,对同一个folder下符合条件的文件进行循环导入,并做相应的文件处理操作。

 1.首先建立个文件夹结构

files用来存放需要导入的excel文件,archive用来存放已经导入db的excel文件

 

选择foreach loop Editor,选择对文件元素进行循环。考虑到路径是可配置的,通过表达式方式配置路径。变量SrcFilePath用来配置excel文件的绝对路径

变量ForeachLoopFile用来接收循环的excel文件名。

Script task 用来获取绝对文件名和arcfile 的绝对路径

Dts.Variables["User::SrcFileFullName"].Value = http://www.mamicode.com/Dts.Variables["User::SrcFilePath"].Value.ToString() + "\\LTFC\\" + Dts.Variables["User::ForeachLoopFile"].Value.ToString();
Dts.Variables["User::ArcFilePathThis"].Value = http://www.mamicode.com/Dts.Variables["User::ArcFilePath"].Value.ToString() + "\\LTFC";

File System task 用来将文件移到arcfolder 下面

3.上面方式已经较为完善的对excel源进行了扩展处理,那么问题来了(防不胜防)如果多个文件导入过程中某个文件导入失败,那么循环也就停止,后续的文件也就无法导入db

现在需要扩展容错性,做到对错误文件也有相应的处理。解决方案如下:

另在 archive文件夹下建立Failed folder用于存储失败的文件。并且已经导入的文件文件名加上时间前缀用于识别导入的文件和时间。

修改Foreach loop Container的ForeachExecuteResult = success ,表示循环过程中忽略容器中的错误事件。

修改Sequence Container 1的FailPackageOnFailure = TRUE,表示此容器中出现错误整个package将返回错误。

修改以上两个属性是确保只对excel 处理时出现错误能够保证外部的循环继续执行,但是对文件进行移动重命名等操作时的错误属于合理的错误,一旦出现将终止循环执行。

 

添加一个FLAG变量 默认值为0 用来控制执行流

Sequence Container 用来将循环的 excel 数据导入db 如果失败设置变量 FLAG = 1  失败和成功都会继续向下执行Sequence Container1

Sequence Container1 用来将导入的文件按照成功和错误重命名后放到相应的文件夹下面FLAG = 0 执行Success操作,FLAG = 1执行Failed操作,Failed 操作执行完重置FLAG = 0

 

 

script task 中包含的代码:

Dts.Variables["User::SrcFileFullName"].Value = http://www.mamicode.com/Dts.Variables["User::SrcFilePath"].Value.ToString() + "\\" + Dts.Variables["User::ForeachLoopFile"].Value.ToString();

Dts.Variables["User::FailedFileName"].Value = http://www.mamicode.com/Dts.Variables["User::ArcFilePath"].Value.ToString() + "\\CAtarget\\Failed\\" + DateTime.Now.ToString("yyyyMMddhhmmss") + "_" + Dts.Variables["User::ForeachLoopFile"].Value.ToString();
Dts.Variables["User::SuccessFileName"].Value = http://www.mamicode.com/Dts.Variables["User::ArcFilePath"].Value.ToString() + "\\CAtarget\\" + DateTime.Now.ToString("yyyyMMddhhmmss") + "_" + Dts.Variables["User::ForeachLoopFile"].Value.ToString();

当然对应的File Conn 和Excel Conn 都是通过循环的excel文件名和其他变量组合表达式配置。

 

以上就是对excel 作为源导入DB的一些扩展,当然还可以在DB中建立一些log表记录excel 的导入信息,导入了哪些文件,每个文件导入了多少行,导入失败的描述等等。

 

笔记:浅谈 ETL(SSIS) 对 EXCEL源的处理