SSIS 在处理平面文件方面做了两件事,这特别令人沮丧,似乎应该有办法解决它们,但我想不通。如果您定义一个包含 10 列的平面文件,使用 CRLF 作为行尾标记分隔制表符,这对于每行正好有 10 列的文件非常适用。两种痛苦的情况是:
如果有人在任何地方提供了第 11 列的文件,那么如果 SSIS 简单地忽略它会很好,因为您还没有定义它。它应该只读取您定义的 10 列然后跳到行标记的末尾,但它所做的是将任何其他数据与第 10 列中的数据连接起来,并将所有这些数据放入第 10 列。真的有点没用。我意识到发生这种情况是因为第 10 列的分隔符不是像所有其他列一样的制表符,而是 CRLF,因此它只会抓取 CRLF 之前的所有内容,并用任何内容替换多余的制表符。在我看来,这并不聪明。
如果有人提供一个只有 9 列的文件,情况会更糟。它将暂时忽略它意外发现的 CRLF,并用下一行开头的列填充任何缺失的列!不聪明在这里是轻描淡写的。谁会希望这种情况发生?文件的其余部分在这一点上是垃圾。
无论出于何种原因,文件宽度的变化似乎都不是不合理的(当然,只有行尾的变化可以被合理地处理(x 更少或额外的列)但看起来这根本没有处理好,除非我我错过了一些东西。
到目前为止,我们对此的唯一解决方案是将一行加载为一个巨大的列(column0),然后使用脚本任务使用它找到的许多分隔符来动态拆分它。这很好用,除了它将行宽限制为 4000 个字符(一个 unicode 列的最大宽度)。如果您需要导入更宽的行(例如用于文本导入的多个 4000 宽列),那么您需要如上所述定义多个列,但是您会遇到每行要求严格的列数。
有没有办法绕过这些限制?