开篇介绍

比如有这样的一个需求,旧的一个业务系统通常将产出的文件输出到同一个指定的目录下的不同子目录,输出的文件类型有 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. poj 1251 poj 1258 hdu 1863 poj 1287 poj 2421 hdu 1233 最小生成树模板题

    poj 1251  && hdu 1301 Sample Input 9 //n 结点数A 2 B 12 I 25B 3 C 10 H 40 I 8C 2 D 18 G 55D 1 E ...

  2. 详解kubeadm生成的证书(转)

    https://docs.lvrui.io/2018/09/28/%E8%AF%A6%E8%A7%A3kubeadm%E7%94%9F%E6%88%90%E7%9A%84%E8%AF%81%E4%B9 ...

  3. [转] 可跨域的单点登录(SSO)实现方案

    SSO简介 定义: 传统的单站点登录访问授权机制是:登录成功后将用户信息保存在session中,sessionId保存在cookie中,每次访问需要登录访问的资源(url)时判断当前session是否 ...

  4. hihocoder 1341 Constraint Checker【string】

    hihocoder 1341 解释:这道题题目还是比较容易理解,就是根据输入的若干个不等式,校验后面输入的数据是否都满足前面的不等式,满足就输出Yes,只要有一个不满足就输出No.如“A<B&l ...

  5. Django2.0 path与Django1.x版本url正则匹配问题

    2.0内的path匹配正则时候无效, 导入re_path即可匹配正则

  6. asp.net core环境变量详解

    环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的环境变量在其它文件里面,不多说了,有兴趣的 ...

  7. Python open详解

    一.打开文件的模式有: 1.r,只读模式[默认]. 2.w,只写模式.[不可读,不存在则创建,存在则删除内容] 3.a,追加模式.[可读,不存在则创建,存在则只追加内容] 二.+ 表示可以同时读写某个 ...

  8. BZOJ1787 [Ahoi2008]Meet 紧急集合 LCA

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1787 题意概括 有一棵节点为n个(n≤500000)的树.接下来m次询问(m≤500000),每次 ...

  9. 使用numpy产生随机数

    numpy中的random模块包含了很多方法可以用来产生随机数,这篇文章将对random中的一些常用方法做一个总结. 1.numpy.random.rand(d0, d1, ..., dn) 作用:产 ...

  10. C# DataTable分页函数

    /// <summary> /// 对DataTable进行分页,起始页为1 /// </summary> /// <param name="dt"& ...