开篇介绍

比如有这样的一个需求,旧的一个业务系统通常将产出的文件输出到同一个指定的目录下的不同子目录,输出的文件类型有 XML,EXCEL, TXT 这些不同后缀的文件。现在需要在 SSIS 中将它们分类整理到不同的文件夹下,比如 XML 的全部拷贝到 A 文件夹, EXCEL 全部拷贝到 B 文件夹。

案例分析

其实文件操作在 C# 中直接编程可能更好解决,不需要特别多的代码就可以完成这个拷贝的任务。SSIS 中比 C# 编程优势的地方可以体现在 SSIS 可以直接解析文件并作为数据源输出到指定的目的地中,比如平面文件,EXCEL 或者数据库等。包括数据拆分,异常捕获,错误数据处理等,涉及到流程控制部分还是会优先选择 SSIS 。

但是在这里通过这样的一个 SSIS 小例子来掌握一下在 SSIS 中如何获取指定目录下的所有文件,以及如何拷贝文件的操作。并且,在这个例子中还介绍了如何在 Control Flow 中在没有先决条件的情况下主动给自己创造一个先决条件等小技巧。

具体问题具体对待,这个例子在实际使用中并不合理,再次强调! 但是可以从这个例子中选择部分处理技巧或者处理方式延用到实际项目中,这个还是完全可以的。

案例实现的过程

新建一个包并创建以下变量 -

DestinationDirectory - 输出的目的地文件夹,将根据文件后缀决定。比如如果文件后缀是 .txt 那么就输出到 TXTFileDirectory 变量指定的文件夹下;如果文件是 .xml 类型,那么就输出到 XMLFileDirectory 变量指定的文件夹下。

它的 Expression 表达式 -

FINDSTRING( @[User::FileName],".txt",)!=? @[User::TXTFileDirectory]:(FINDSTRING( @[User::FileName],".xml",)!=? @[User::XMLFileDirectory] : "")

Directory - 源文件夹

FileExtensionFilter - 为了演示这个例子,我们假设要循环获取 Directory 目录下的所有文件 *.*,然后在这些文件中选择 .txt 和 .xml 后缀的文件拷贝到指定目录下。

技巧一 - 如何获取指定目录下所有文件名称

  • FileName - 文件的名称
  • FileNames - 获取所有的文件名称集合,这个集合注意是 Object 类型的 - 使用 SSIS 中的 Foreach Loop Container 是可以遍历数组的。

技巧二 - 在循环遍历的数组类型在 SSIS 用什么数据类型表示 - OBJECT

  • IsTopDirectory - 是否只在当前目录中查找,0 - 当前目录,非0 - 当前目录以及所有子目录

在控制流中编辑 Script Task - SCR_LoadAllFiles, 要分得清楚哪些是只读的,哪些是需要修改值 - 可读写类型。

记得引用 System.IO 命名空间,在 MAIN 方法中的代码 -

public void Main()
{
string directory = Dts.Variables["User::Directory"].Value.ToString();
int isTopDirectory = Int16.Parse(Dts.Variables["User::IsTopDirectory"].Value.ToString());
string extension = Dts.Variables["User::FileExtensionFilter"].Value.ToString();
// TODO: Add your code here if (isTopDirectory == )
{
Dts.Variables["User::FileNames"].Value = Directory.GetFiles(directory, extension, SearchOption.TopDirectoryOnly);
}
else
{
Dts.Variables["User::FileNames"].Value = Directory.GetFiles(directory, extension, SearchOption.AllDirectories);
} Dts.TaskResult = (int)ScriptResults.Success;
}

Foreach Loop Container 中 - 选择 Foreach From Variable Enumerator 这样就可以遍历一个数组集合了。

每次循环从 FileNames 集合中取到的一个文件名就赋值给 FileName。

下面要做的操作是 - 在循环中根据文件的后缀的不同拷贝到不同的文件夹。由于文件夹下可能有除了 .xml 和 .txt 之外的很多文件,因此在这里需要判断如果不是 .xml 和 .txt 文件类型的就忽略拷贝动作。

问题在于:在控制流 Control Flow Task 中并没有像 Data Flow Task 数据流中所具有的像 Conditional Split 等控件,所以这里只能使用流程中的 Precedence Constraint 先决条件或者叫做先决约束来控制。

由于在 Copy Files to Directory 这个 File System Task 本身不具备这种过滤操作,因此主动的在它的前面添加一个 Expression Task 然后就可以使用 Precedence Constraint 了,实际上这个 Expression Task 本身不处理任何操作。

技巧三 - 如何在没有上游控件输出的情况下,在控制流中实现条件判断处理

Expression Task 中可以随便拖放一个变量 -

关键的还是在连接 Cope Files To Directory 的那条线上我们要编辑条件 -

在最开始定义 DestinationDirectory 变量的时候已经介绍过了,它的值是由其它变量决定的。这里,在每次循环的时候都可以拿到 FileName 文件名,然后如果在文件名中能查找到 .txt 那么 DestinationDirectory 的值就等于 TxtFileDirectory 的值,后面同理。如果都找不到,那么就等于空字符串。所以上面的判断就体现这样的逻辑,只有后缀是 .txt 或者 .xml 结尾的文件才会进入到下一步被处理。

在 Copy Files to Directory (File System Task) 中 先选择 Operation 然后再配置其它操作 -

当然 File System Task 不仅仅只可以用来操作 Cope Files,还有其它很多很多操作 -

最后保存执行 Package,它会遍历所有的子目录并获取所有的文件名称。

来自不同目录下的所有 .txt 文件集中到一个文件夹下。

来自不同目录的 .xml 文件集中到一个目录下。

那么利用上面的这些文件处理控件包括遍历等到底可以实现什么具体功能? 有一个需求可能会存在 - 就是有一个 JOB ,每天执行一次,然后监视一下指定目录下文档的变化情况,将变化的情况写入数据库表中,或者做成报表,可以非常容易的看到那些是今天新增加的文件,哪些文件发生了改变等等。

更多 BI 文章请参看 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server) 如果觉得这篇文章看了对您有帮助,请帮助推荐,以方便他人在 BIWORK 博客推荐栏中快速看到这些文章。

微软BI 之SSIS 系列 - 在 SSIS 中将指定目录下的所有文件分类输出到不同文件夹的更多相关文章

  1. [转]gnome环境中将家目录下预设的文件夹由中文名称改为英文名称

    参考文章:gnome环境中将家目录下预设的文件夹由中文名称改为英文名称 打开终端 1 修改语言环境为英文 export LANG=en_US 如果想修改语言环境为日语,可执行 export LANG= ...

  2. 微软BI 之SSIS 系列 - 在 SSIS 中导入 ACCESS 数据库中的数据

    开篇介绍 来自 天善学院 一个学员的问题,如何在 SSIS 中导入 ACCESS 数据表中的数据. 在 SSIS 中导入 ACCESS 数据库数据 ACCESS 实际上是一个轻量级的桌面数据库,直接使 ...

  3. 微软BI 之SSIS 系列 - 利用 SSIS 模板快速开发 SSIS Package

    开篇介绍 在做 ETL 项目的时候,往往很多 Package 的开发都是基于相同的模型和流程.比如在 Package 开始运行时需要向 Process Log 表中插入记录,在 Package 运行结 ...

  4. 微软BI 之SSIS 系列 - 在 SSIS 输出平面文件时根据运行日期生成不同的文件名称

    开篇介绍 在 SSIS 中操作文件的输入和输出是非常方便的,这个例子讲解一个最简单的需求:比如每天从数据库中查询一批数据要输出到文件,每天产生一个文件,那么文件的名称按照"文件名+日期&qu ...

  5. 微软BI 之SSIS 系列 - 在 SSIS 中使用 Web Service 以及 XML 解析

    开篇介绍 Web Service 的用途非常广几乎无处不在,像各大门户网站上的天气预报使用到的第三方 Web Service API,像手机客户端和服务器端的交互等都可以通过事先设计好的 Web Se ...

  6. 微软BI 之SSAS 系列 - 多维数据集维度用法之一 引用维度 Referenced Dimension

    在 CUBE 设计过程中有一个非常重要的点就是定义维度与度量值组关系,维度的创建一般在前,而度量值组一般来源于一个事实表.当维度和度量值组在 CUBE 中定义完成之后,下一个最重要的动作就是定义两者之 ...

  7. 微软BI 之SSRS 系列 - 实现 Excel 中图表结合的报表设计

    来自群里面讨论的一个问题,EXCEL 中有类似于这样的图形,上面是 Chart, Chart X轴上的值正好就是下方 Table 的列头,这个在 SSRS 中应该如何实现?   SSRS 2008.2 ...

  8. 微软BI 之SSRS 系列 - 报表邮件订阅中 SMTP 服务器匿名访问与 Windows验证, 以及如何成功订阅报表的实例

    这篇文章源于在上一篇博文中有园友提出订阅 SSRS 报表时的一个问题,  于是就好好总结了一下,把有关 SSRS 报表订阅的要点和容易出现问题的地方写出来,希望对大家有所帮助! 参看上一篇博文 - S ...

  9. 微软BI 之SSAS 系列 - 自定义的日期维度设计

    SSAS Date 维度基本上在所有的 Cube 设计过程中都存在,很难见到没有时间维度的 OLAP 数据库.但是根据不同的项目需求, Date 维度的设计可能不大相同,所以在设计时间维度的时候需要搞 ...

随机推荐

  1. Web开发.net framework 类库中必须掌握的命名空间(或者类)【转】

    Web开发常用命名空间和类. System.Collections //命名空间包含接口和类,这些接口和类定义各种对象(如列表.队列.位数组.哈希表和字典)的集合.System.Collections ...

  2. bootstrap——辅助类和响应式工具类

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Web应用程序项目XXXX已配置为使用IIS。无法访问IIS 元数据库。您没有足够的特权访问计算机上的IIS

    错误图片:

  4. python实现的椭圆曲线加密

    我也看得云里雾里, 但是ECC和RSA并列为非对称加密双雄, 还是很有必要了解一下的. RSA是用质数分解,ECC是用离散的椭圆方程解,安全度更高. 而且,这个ECC的加法乘法规则,和普通都不一样, ...

  5. sum of powers

    题意: 考虑所有的可重集{a1,a2,a3....ak} 满足a1+a2+....+ak=n,求所有a1^m+a2^m+a3^m的和 n,m,k<=5000 题解: part1: 考虑f[i][ ...

  6. Jquery empty() remove() detach() 方法的区别

    方法简介: empty() This method removes not only child (and other descendant) elements, but also any text ...

  7. 【Java】 剑指offer(29) 顺时针打印矩阵

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 思 ...

  8. request中获取post的json对象数据content-type=“text/plain”

    其实采用http://www.cnblogs.com/SimonHu1993/p/7295750.html中的方法一都能获取到,就是通过获取request中的流数据,拿到json数据,理论上应该适用各 ...

  9. 算法进阶面试题05——树形dp解决步骤、返回最大搜索二叉子树的大小、二叉树最远两节点的距离、晚会最大活跃度、手撕缓存结构LRU

    接着第四课的内容,加入部分第五课的内容,主要介绍树形dp和LRU 第一题: 给定一棵二叉树的头节点head,请返回最大搜索二叉子树的大小 二叉树的套路 统一处理逻辑:假设以每个节点为头的这棵树,他的最 ...

  10. Linux笔记 rm -rf 嘻嘻

    学习目标:常用linux命令的使用 JAVAEE :后台应用都会涉及到linux系统,应用程序的部署,运维,分布式集群,大数据,云计算 虚拟机:虚拟出来的计算机 虚拟机软件:用来产生虚拟机的一个软件 ...