【问题标题】:SSIS - Process a flat file with varying dataSSIS - 处理具有不同数据的平面文件
【发布时间】:2016-03-24 10:08:15
【问题描述】:

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

<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 分解标题。之后,由于数据组的数量不同,它变得更加棘手。

【问题讨论】:

    标签: ssis


    【解决方案1】:

    我自己想出的解决方案并没有尝试在平面文件源中进行拆分,而是在脚本中进行拆分。我的数据流如下所示。

    因此,平面文件源输出只是包含整行的单列。脚本组件包含暂存表中每一列的输出列。脚本如下所示。

    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 属性(脚本转换编辑器 > 输入和输出 > Output0)设置为无。否则,您的脚本中将没有可用的 Output0Buffer。最后,OLE DB 目标只是将脚本输出列映射到暂存表列。这解决了我从单个输入记录创建多个输出记录的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多