1

我对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 = 页脚、今天的日期、序列号、实际行数。

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

现在,我不确定如何在平面文件连接管理器中进行设置,因为标题/拖车详细信息与卡号的位置相同。

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

4

2 回答 2

2

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

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

在此处输入图像描述

于 2013-08-20T12:36:26.847 回答
0

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

如果您执行脚本任务,您可以完全绕过平面文件连接。下面简要介绍如何:

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

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];
    }
}

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

于 2013-08-21T11:51:18.733 回答