微软BI 之SSIS 系列 - 使用 File System Task 处理文件与目录

浏览: 3639

开篇介绍

在 ETL 项目中,我们经常碰到这样的场景 - 数据源来自于文件,一个或者很多个文件。这些文件有可能是每日或者每周从其它应用程序中传送过来作为 ETL 项目的数据源。我们在 SSIS 中可以从这些文件数据源中加载数据,之后再进行转换入库等过程。但是有一个很重要的问题,就是源文件被处理之后不断在硬盘上累加累加,因此到最后磁盘空间不够。因此通常的做法就是当源文件处理完成之后,我们需要将源文件拷贝复制到另外一个备份服务器磁盘,然后再删除掉这些文件。

在 SSIS 中我们实际上有两种处理文件的方式,一种是通过 Script Task 自己写代码的形式实现,一种就是通过 File System Task 来实现。在这篇文章中我们将介绍使用 File System Task 来完成对文件以及文件夹的操作。

File System Task  

File System Task 主要用来在 SSIS 中处理单个文件或者文件夹,比如复制,移动,删除,重命名等常规操作。当然还有对文件或者文件夹的一些属性的操作,比如显示或隐藏,只读操作等。

在我的测试 INPUT_DRECTORY 下有一个文件

D:\BIWORKSPACE_FILE\INPUT_DIRECTORY\15\Employee.txt,我们可以将这个文件先复制到 D:\BIWORKSPACE_FILE\ARCHIVE_DIRECTORY\15 文件夹下,并在存储的时候将文件名称后面加上时间后缀。

新建一个包,并添加一个 File System Task。

新建两个变量,一个变量表示 Source File 源文件路径,另一个表示 Archive File 目标文件路径,并且目标文件的生成是根据当前时间的。

PV_ARCHIVE_FILE_PATH 中的表达式 -

"D:\\BIWORKSPACE_FILE\\ARCHIVE_DIRECTORY\\15\\"+ REPLACE( (DT_WSTR, 31)(DT_DBDATE) GETDATE(),"-","_") +"_Employee.txt"

如果指定的都是变量,那么就不需要新建文件连接,File System Task 在内部的处理其实类似于 C#中的代码处理一样。在 Operation 中有很多的操作,如同前面介绍的一样,File System Task 在当前的配置中只能处理单个文件或者文件夹,但是配合以 Foreach Loop 就可以处理多个文件了。

保存并执行,这个过程非常的简单,在 Archive Folder 下能看到保存之后的文件。

如果把 Destination Connection 中 OverwriteDestination 属性修改为 False 的话,那么在第二次运行包的时候就会出现错误。

错误信息如下:

[File System Task] Error: An error occurred with the following error message: "The file 'D:\BIWORKSPACE_FILE\ARCHIVE_DIRECTORY\15\2014_09_21_Employee.txt' already exists.".

所以如果看到这种错误的话,就知道什么地方的属性设置错了。

Move File 的失败

将 Operation 改成 Move File 然后执行。

会出现这样的一个错误:

[File System Task] Error: An error occurred with the following error message: "Could not find a part of the path.". 

在这种情况下,是不能这样来操作的。我们先演示另外一种正确的方法,最后再来解决这个问题。

方式是,先拷贝然后再删除源文件。因此在这个 Task 之下再添加一个 Task,用来在拷贝之后删除源文件。

这样做是可以成功的,源文件也没有了。

 

再来看之前 Move 的那个问题,是什么原因造成的?所谓的 Move 移动,通常是指将一个文件从一个地方剪切移动到另外一个"地方",而这个"地方"很明显指的应该是文件夹。

所以再新建一个变量 PV_MOVE_FILE_FOLDER - D:\BIWORKSPACE_FILE\INPUT_DIRECTORY\15

新建一个 File System Task,目标变量是指向 PV_MOVE_FILE_FOLDER 中的文件夹地址。

单独执行这个 Task,这次文件是可以 Move 成功的。但是也要注意,前提是这个文件必须是存在的,否则就会碰到类似于这样的错误:

[File System Task] Error: An error occurred with the following error message: "Could not find file 'D:\BIWORKSPACE_FILE\INPUT_DIRECTORY\15\Employee.txt'.".

最后再添加一个 File System Task 完成 Move File 之后对 Archive File 重命名。

新建一个变量 PV_MOVE_FILE_PATH 表示 Move 之后的 Archive File。

把这个文件作为数据源,然后目标文件还是表达式变量 PV_ARCHIVE_FILE_PATH,这样就完成了对被移动文件的重命名。

这样的效果就实现了,但是这种 Move 的方式很明显没有先 Copy 然后再 Delete 的方式简单。因为在文件拷贝的时候就直接可以跟文件重命名了!

演示 Directory 的操作

在 D:\BIWORKSPACE_FILE\INPUT_DIRECTORY\15 下有一个文件夹 BIWORK_TEST_DIREC,它们的结构如下:

  1. D:\BIWORKSPACE_FILE\INPUT_DIRECTORY\15\BIWORK_TEST_DIREC\1\Employee.txt
  2. D:\BIWORKSPACE_FILE\INPUT_DIRECTORY\15\BIWORK_TEST_DIREC\2\Made-in-China.com.csv

我们将把 BIWORK_TEST_DIREC 以及它下面的所有文件夹和文件移动到 D:\BIWORKSPACE_FILE\ARCHIVE_DIRECTORY\15 目录下。

保存并执行,操作成功,原本在 INPUT_DIRECTORY 的文件夹和下面的文件就统统移动到 ARCHIVE_DIRECTORY 下来了。

总结

当然使用 File System Task 操作文件是不是最好的方式?不见得,因为每一次操作,比如移动文件,拷贝,移动文件夹等等步骤必须分开在不同的 File System Task 中。但是实际上这些步骤可以都一起在 Script Task 中实现,并且 File System Task 对于文件源是无法做到验证的。比如移动文件的时候由于源文件不存在而造成失败,这种情况在 Script Task 中都是可以很好的避免的,因此实际上大多数时候都是通过 Script Task 来实现这类文件操作的。但是由于不同的开发者习惯不同,因此在各种 ETL 项目中, File System Task 的使用还是比较普遍的,并且省掉了 Coding 部分直接通过简单的配置来实现这 比Script Task 要更加方便。

最后,通常情况下操作文件都是一批一批来处理的,这样只有结合到 Foreach Loop 等组件来实现多个文件的处理,这个是后面再来介绍。

推荐 0
本文由 BIWORK 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册