如何在固定长度平面文件中删除没有标识符的第一行和最后一行?

时间:2013-02-24 07:06:50

标签: ssis

我有一个带有页眉和页脚的固定长度的平面文件,但这些行没有任何标识符,如H代表标题,T代表预告片,D代表数据或类似的东西。

我的所有数据都从位置1开始,但页眉和页脚以行格式的不同位置开头。我试图使用条件分割,但我无法得到我想要的结果。

请帮我找一些逻辑来从页面和页脚中取出数据文件。我想将数据存储在SQL Server表中,并将页眉/页脚数据存储在平面文件中以供将来参考。

1 个答案:

答案 0 :(得分:0)

由于您没有在问题中包含确切的文件格式,我们假设看起来像这样:

    This is the header line with some spaces at the beginning.
This, is, real, line 1
This, is, real, line 2
       End of file. It has some spaces too at the beginning.

如果这是您的情况的正确表示,您可以使用平面文件源,在一列中完整地读取每个记录,比如EntireRow,然后使用条件拆分来识别使用以下条件的页眉/页脚:

LEN(EntireRow) > LEN(TRIM(EntireRow))

这里的问题是如何拆分有意义的行(上例中的实线1和2)。您可以将其转储到另一个文件中。现在,这个文件将被清除,页眉和页脚被删除。这是一个简单但不是最有效的解决方案。

解决方案2:

更好的解决方案是使用脚本组件。了解如何动态添加行。一个这样的例子:http://www.sqlis.com/post/The-Script-Component-as-a-Transformation.aspx

现在,为了帮助您入门,示例代码将使用您的条件消除页眉/页脚,它们不会从位置1开始......没有错误处理。上面的链接将告诉您如何在该输出中添加输出和列。确保列的数据类型与源文件的数据类型匹配。

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    /*
      Add your code here
    */

    if ((Row.EntireRow.Length == Row.EntireRow.Trim().Length))
    {
        string[] sArrFields = Row.EntireRow.Split(',');

        MeaningfulBuffer.AddRow();
        MeaningfulBuffer.Col1 = sArrFields[0];
        MeaningfulBuffer.Col2 = sArrFields[1];
        MeaningfulBuffer.Col3 = sArrFields[2];
        MeaningfulBuffer.Col4 = sArrFields[3];

    }
}

希望这么多指导足以让您解决问题,并提供我提供的两种解决方案之一。请回复。