开篇介绍

比如有这样的一个需求,旧的一个业务系统通常将产出的文件输出到同一个指定的目录下的不同子目录,输出的文件类型有 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. cf776c

    这题用尺取法是怼不出来的... 一开始看到区间和等于k的幂,并且有负数,首先想到将前缀和排序后用尺取法,但因为排序后的前缀和次序是乱的,只适用带绝对值的情况(poj2566),所以无法做. 看了题解后 ...

  2. splay好板子

    找到一份比较好的板子,链接https://blog.csdn.net/crazy_ac/article/details/8034190 #include<cstdio> #include& ...

  3. pytest十:用例 a 失败,跳过测试用例 b 和 c 并标记失败 xfail

    当用例 a 失败的时候,如果用例 b 和用例 c 都是依赖于第一个用例的结果,那可以直接跳过用例 b 和 c 的测试,直接给他标记失败 xfail用到的场景,登录是第一个用例,登录之后的操作 b 是第 ...

  4. CentOS 上安装 nodejs v11.0.0

    下载 nodejs 淘宝 nodejs 镜像地址:https://npm.taobao.org/mirrors/node wget 命令下载: wget https://npm.taobao.org/ ...

  5. jqgrid 表格中筛选条件的多选下拉,树形下拉 ;文本框清除插件;高级查询多条件动态筛选插件[自主开发]

    /** * @@desc 文本框清除按钮,如果isAutoWrap为false当前文本框父级必须是relative定位,boostrap参考input-group * @@author Bear.Ti ...

  6. gitlab的docker安装,非标准端口,如何处理?

    这个问题的定义是: 如果我们不是用的80端口对外提供服务, 但gitlab的docker容器里的nginx却是80端口, 那么,在我们clone代码时,带的Http地址也会是80端口,这显然会出现问题 ...

  7. 在django中,redirect如何传递message。

    众所周知,在django中,默认的message,只能在同一个request中传递. 但如果在请求过程中,使用了redirect跳转,那么,这个一次性的message就会失败, 无法在前端给用户提示. ...

  8. LeetCode 4. Median of Two Sorted Arrays (分治)

    两个有序的数组 nums1 和 nums2 维数分别为m,n.找所有数的中位数,复杂度 O(log (m+n)) 注意:奇偶个数,分治法求解,递归出口特殊处理.取Kth smallest数时,分治取m ...

  9. ctsc2017

    就看了几道题目.. day1t1 良心题啊.. 经过一波转化就变成了求某一个数后面有几个比它大的 并且是有长度的(固定的) 然后这样暴力是nlogn的 再写个后面的部分分大概就有70了 其实100也很 ...

  10. Android 7.0 PopupWindow 又引入新的问题,Google工程师也不够仔细么

    Android7.0 PopupWindow的兼容问题   Android7.0 中对 PopupWindow 这个常用的控件又做了一些改动,修复了以前遗留的一些问题的同时貌似又引入了一些问题,本文通 ...