sql-server – SSIS 2012 – 条件标头的位置

我需要使用SSIS将几千个txt文件放到SQL Server 2012实例中.

问题是某些txt文件的前两行有控制校验和,有些则没有.

如果文件具有校验和,则其第一行以“HEADER”开头 – 在这种情况下,我必须跳过前两行,然后从第3行读取列标题并从第4行开始加载数据.

如果文件没有校验和,则列#1中将存在列名,数据将从第2行开始.

现在,我的问题是:处理这种情况的侵入性最小的方法是什么?我很懒,所以我正在寻找最大效果的最小努力.

我的想法到目前为止:

>使用C#脚本组件检测校验和的存在,并构建两个单独的流,每个流对应一种文件类型.缺点:两个几乎相同的流程(我不是冗余的忠实粉丝)
>首先使用PowerShell在运行SSIS流之前从文件中删除校验和.缺点:需要重写大量文件(性能命中)
>在StackOverflow上询问.缺点:StackOverflow社区可以看作具有讽刺意味.

任何提示?

最佳答案 这是一种方法.

>创建2个平面文件连接管理器,在设计模式下,浏览每个文件的示例文件,以便设置列等.
>对于没有校验和行的Flat File Connection Manager,将Header Rows保留为Skip为0,对于具有Checksum行的Flat File Connection Manager,将其设置为跳过前两行,如下所示.
《sql-server – SSIS 2012 – 条件标头的位置》
>将两个连接管理器的DelayValidation属性设置为true.
>在数据流任务中,使用脚本组件检测文件是否具有校验和行.
>在脚本组件的输出中,将文件的完整路径作为输出列,并且还有一个标志,指示文件是否具有校验和行.例如:HasCheckSumRows
>将脚本组件的输出连接到条件拆分任务.
>在条件性拆分任务中,基于HasCheckSumRows标志设置为true进行拆分,并创建2个输出,1用于带有校验和行的文件,其他用于无文件.
>创建2个平面文件源,1个用于校验和行文件,使用您为这些类型的文件创建的平面文件连接管理器,另一个用于没有校验和行的常规文件.
>使用输出列中的完整文件路径将条件拆分中的2个输出连接到相应的平面文件源,作为平面文件源的连接字符串.
>最后,使用Union All组件将两种类型文件中的行恢复为1个输入数据流.因此,这不会复制您的工作流程(即不会导致冗余),因为您拥有1个流中的所有行.

希望这是有道理的.

点赞