3

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

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

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

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

我不认为创建重复数据流一遍又一遍地处理同一组列的方法对于我们的数据仓库项目来说是一个很好的答案,我更喜欢采用最后一个文件版本并拥有的源组件能够将列标记为“非强制性”并在缺失时提供空值。

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

欢迎任何想法或建议!

4

1 回答 1

1

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

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

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

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

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

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

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

于 2012-11-15T16:59:10.493 回答