SSIS - 处理包含不同数据的平面文件

时间:2016-03-24 10:08:15

标签: ssis

我必须处理一个平面文件,其语法如下,每行一个记录。

<header>|<datagroup_1>|...|<datagroup_n>|[CR][LF]

标头具有永不改变的固定长度字段格式(ID,时间戳等)。但是,存在不同类型的数据组,即使是固定长度,其字段数也会根据数据组类型而有所不同。数据组的前三个数字定义其类型。每条记录中的数据组数量也各不相同。

我的想法是有一个临时表,我将插入所有数据组。所以有两个这样的记录,

12320160101|12323456KKSD3467|456SSGFED43520160101173802|
98720160102|456GGLWSD45960160108854802|

将在临时表中生成三条记录。

ID   Timestamp   Data
123  01/01/2016  12323456KKSD3467
123  01/01/2016  456SSGFED43520160101173802
987  02/01/2016  456GGLWSD45960160108854802

这将允许我预处理分阶段记录以进行进一步处理(一些将被丢弃,一些将其数据进一步分解)。我的问题是如何将平面文件分解为临时表。我可以使用管道(|)拆分整个记录,然后使用派生列转换来使用SUBSTRING分解标题。之后,由于数据组的数量不同,它变得更加棘手。

1 个答案:

答案 0 :(得分:0)

我自己提出的解决方案并没有尝试在平面文件源中进行拆分,而是在脚本中进行拆分。我的数据流看起来像这样。

enter image description here

因此,平面文件源输出只是包含整行的单个列。脚本组件包含Staging表中每列的输出列。脚本看起来像这样。

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    var splits = Row.Line.Split('|');

    for (int i = 1; i < splits.Length; i++)
    {
        Output0Buffer.AddRow();
        Output0Buffer.ID = splits[0].Substring(0, 11);
        Output0Buffer.Time = DateTime.ParseExact(splits[0].Substring(14, 14), "yyyyMMddHHmmssFFF", CultureInfo.InvariantCulture);
        Output0Buffer.Datagroup = splits[i];
    }
}

请注意,在SynchronousInputID属性(脚本转换编辑器&gt;输入和输出&gt; Output0)中必须设置为None。否则,您的脚本中不会有Output0Buffer。最后,OLE DB Destination只将脚本输出列映射到Staging表列。这解决了从单个输入记录创建多个输出记录时遇到的问题。