我必须处理一个平面文件,其语法如下,每行一个记录。
<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分解标题。之后,由于数据组的数量不同,它变得更加棘手。
答案 0 :(得分:0)
我自己提出的解决方案并没有尝试在平面文件源中进行拆分,而是在脚本中进行拆分。我的数据流看起来像这样。
因此,平面文件源输出只是包含整行的单个列。脚本组件包含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表列。这解决了从单个输入记录创建多个输出记录时遇到的问题。