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



我在一个数据仓库项目中工作,该项目有很多源创建平面文件作为源,我们正在使用SSIS将这些文件加载到暂存表中,我们目前正在使用平面文件源组件。

但是,过一段时间后,我们需要在其中一个文件中添加一个额外的列,并且从文件规范更改之日起,添加该额外的列。这个练习经常发生,随着时间的推移积累了很多版本。

根据我在这里和互联网上找到的答案,处理这种情况的商定方法似乎是在这个版本的新的独立数据流中设置一个新的平面文件源,以保持旧文件ETL过程的可重新运行性。方法概述如下,例如:具有较少列的平面文件连接的SSIS pkg将失败

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

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

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

欢迎任何想法或建议!

以下内容在处理时会失去效率(超过单独的数据流),但会为您提供在单个数据流中处理多个文件类型的灵活性。

只需指定行分隔符,就可以将平面文件连接安排为返回行,而不是单独的列。将其连接到平面文件源组件,该组件将每行输出一列。我们现在有一行,它代表了您所知道的众多文件类型中的一种——下一步是确定您拥有的文件类型。

使用带有脚本组件的平面文件类型的输出。传入一列并传出所有可能列的超集。我们已经丢失了通常从文件源闪烁的元数据,因此您需要在脚本组件输出类型中建立列名/类型/大小。

在脚本组件中,传递该行并将其分解为组件列。您必须执行模式匹配(可能使用RegularExpression.Regex.match)来确定新列何时开始。希望该文件格式良好,这将对您有所帮助——注意文本列中的引号和逗号。

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

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

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

最新更新