SSIS导入带有标题和尾部行的固定宽度平面文件

时间:2013-08-19 22:28:22

标签: ssis

我对SSIS非常熟练,但绝不是专家。我的任务是导入一个相当复杂的固定宽度平面文件,其中包含标题和尾部行。现在,没有标题和预告行,我相信我可以相当容易地做到这一点。但是,我对如何使用额外的行进行此操作感到困惑。这是此示例的简化版本。第一行是标题行,最后一行拖车行之间是任意数量的数据。

0 201308190102
1 123412341234   MR            JOE              BLOGGS                19810529
1 123412341235   MS            SUE              BLOGGS                19810516
9 201308190102

列位于标题行中:操作类型0 =标题,今天的日期YYYYMMDD,序列号01,预期行数02

数据行:操作类型1,2,3取决于创建,更新,删除,卡号123412341234,标题,名字,姓氏,出生日期 预告片行:动作类型9 =页脚,今天的日期,序列号,实际行数。

我需要对文件的日期,序列号和行数进行验证检查。

现在,我不知道如何在平面文件连接管理器中设置它,因为标题/尾部详细信息与卡号相同。

所以我的想法是将行标题和尾部行按行号和文件结尾分开?我是否需要在脚本任务中将它们分开?我是否需要逐行设置平面文件连接并通过脚本任务拆分列?

2 个答案:

答案 0 :(得分:2)

如果您可以放心地从数据中确定页眉和页脚行,我建议使用条件拆分。例如,在过去的项目中,页眉和页脚行的前两个字符分别是“HR”和“TR”。

根据该约定,我能够分离实际需要处理的行。在一个单独的路径中,我根据标题行数据进行了一些验证。最后,我合并了两个路径,因为我在标题中使用了目标表中处理日期列的日期。

enter image description here

答案 1 :(得分:0)

如果您在c#中有一些编码经验,我会推荐一个脚本任务。在解析一些许可文件时我遇到了同样的问题,它似乎是解析更复杂文件的唯一方法。

如果执行脚本任务,则可以完全绕过平面文件连接。以下是如何:

的简要说明

首先在包中添加一个String参数。在您的脚本任务选项中,将您的参数添加为只读变量。然后使用此代码段

访问它
byte[] empty = new byte[] { };
    base.PreExecute();
    //Outside parameter for file path
    //Check for the parameter existance
    IDTSVariable100 filePathVariable; //This is the var that will hold the parameter
    try
    {
        filePathVariable = this.ReadOnlyVariables["ParameterName"];
    }
    catch (Exception)
    {
        this.Log(@"The package configuration is invalid. The variable / parameter ""ParameterName"" is missing. 
            It has to be available and be of type string and give the path to the file to be Imported", 0, empty);
        throw;
    }
    string filePath = filePathVariable.Value.ToString();

现在使用类似的东西来读取文件并将其拆分成行..

try
    {
        using (StreamReader reader = new StreamReader(filePath))
        {
            //Read file and split into lines
            string fileStream = reader.ReadToEnd();
            fileLines = fileStream.Split('\n');
        }
    }
    catch (Exception e)
    {
        this.Log(@"Error reading file into list of strings. Reason: " + e.Message, 0, empty);
        throw;
    }

将上述所有内容放在脚本任务的PreExecute部分以及每行所需的转换中。然后创建一个数组或行列表并输出如下:

  public override void CreateNewOutputRows()
{
    for (int i = 0; i < lineCount; i++)
    {
        ItemsBuffer.AddRow();
        ItemsBuffer.ColumnName = CreatedLineList[i];
    }
}

如果您对此有任何疑问,请告诉我