SSIS 平面文件 - 如何处理文件版本/生成

标签 ssis flat-file

我正在从事一个数据仓库项目,其中有很多源创建平面文件作为源,我们正在使用 SSIS 将这些文件加载​​到我们的临时表中,我们当前正在使用平面文件源组件。

但是,过了一段时间,我们需要在其中一个文件中添加一个额外的列,并且从文件规范更改的日期开始添加该额外的列。这个练习发生得相当频繁,并且随着时间的推移积累了相当多的版本。

根据我在这里和互联网上其他地方可以找到的答案,处理这种情况的商定方法似乎是在该版本的新单独数据流中设置新的平面文件源,以保持可重新运行性用于旧文件的 ETL 过程。 此处概述了方法,例如:SSIS pkg with flat-file connection with fewer columns will fail

在我们的特定设置中,附加列始终是附加列(永远不会删除旧列),而且,出于逻辑原因,如果我们在单独的数据流中保留旧文件的可重新运行性,则新列不能是强制性的。

我认为创建重复数据流来一遍又一遍地处理同一组列的方法对于像我们这样的数据仓库项目来说并不是一个好的答案,我更喜欢使用最后一个文件版本的源组件并且能够将列标记为“非强制”并在缺失时传递 null。

有人知道 SSIS 平面文件组件可以更灵活地处理旧文件版本,或者有更好的解决方案来解决此问题吗? 我认为这样的组件需要在命名列的基础上处理文件,而不是现有的从左到右的方法?

欢迎任何想法或建议!

最佳答案

以下内容在处理时会降低效率(相对于具有单独的数据流),但将为您提供在单个数据流中处理多种文件类型的灵 active 。

您可以通过仅指定行分隔符来安排平面文件连接以返回行而不是单个列。将其连接到平面文件源组件,该组件将每行输出一列。现在,我们有一行代表您所知道的多种文件类型之一 - 下一步是确定您拥有哪种文件类型。

使用脚本组件使用平面文件类型的输出。传入单个列并传出所有可能列的超集。我们丢失了通常从文件源显示的元数据,因此您需要在脚本组件输出类型中构建列名称/类型/大小。

在脚本组件内,传递该行并将其分成其组件列。您必须执行模式匹配(可能使用 RegularExpression.Regex.Match)来识别新列何时开始。希望该文件格式正确,这将对您有所帮助 - 请注意文本列中的引号和逗号。

您现在可以通过确定拥有的列数和默认缺失的列来访问文件类型。设置行的输出列以传递组成部分。您可能需要附加一个新列来记录输出的文件类型。

该过程的其余部分应该能够使用单个数据流加载您的表,因为您已经满足了脚本中的所有文件类型的需求。

我不建议您轻易执行上述操作。当您必须对所有列/类型等进行编码时,SSIS 的好处会有所减弱,但是它将为您提供单个数据流来处理每个文件版本,并且可以在传递新列时进行扩展。

关于SSIS 平面文件 - 如何处理文件版本/生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13358813/

相关文章:

C# Streamreader - 仅在 {CR}{LF} 处中断

c# - 在 SSIS 脚本组件中使用 C# 将多个平面文件行提取为一个

sql-server - SSIS 错误代码 DTS_E_INDUCEDTRANSFORMFAILUREONERROR

sql-server - SSIS 作业失败 - 已添加具有相同 key 的项目

sql - SSIS - 将 nchar 空字符串转换为 int 时出现表达式计算错误

php - 平面文件与数据库——速度?

r - 在 R 中创建固定宽度文件,每个元素都有唯一的位置

ssis - 如何跟踪 SSIS 数据流任务中成功处理或失败的行的状态?

sql-server - ssis 包中 'drop table' 或 'drop index' 存在语法错误

r - 以最快、最灵活的方式绘制超过 200 万行平面文件数据?