0

我有一个输入平面文件,每个输出记录有 2 种类型的输入记录。第一条记录(由第一列中的 C 标识)具有 ID 和人口统计信息。第二条记录(由第一列中的 L 标识)包含一些财务信息。它们是管道分隔的并且具有不同的长度。

没有任何方法可以将所有 C 记录写入一个流,将 L 记录写入另一个流,然后将它们重新组合在一起。所以我的解决方案是进行有条件的拆分。当我点击 C 记录时,我需要在 SSIS 变量中存储所有信息。当我点击 L 记录时,从变量中生成派生列,并使用派生列和 L 记录中的列来制作我的输出记录(也是平面文件)。

我浏览了整个 Internet,找不到 C# 代码来在 C 记录路径的脚本组件中设置我的变量。我希望代码看起来像

Variable.User::Firstname = Column 2(来自输入文件) Variable.User::Lastname = Column 3(来自输入文件)

等等

有人可以帮帮我吗?

谢谢,

迪克

4

3 回答 3

1

这个想法行不通。您认为在处理每一行时您将能够对变量做什么?您对变量值所做的任何事情都必须在填充它们的脚本中完成,因为当您离开脚本时,该变量将由下一行的值填充。

但是,将您的问题视为学术问题,这里已经询问并回答了访问脚本组件中变量的方法: 如何访问脚本组件内的 ssis 包变量

这是我将如何处理这个问题:

  1. 配置您的源组件,使每一行都是一列
  2. 接下来进行条件拆分,将 C 行发送到一条路径,将 L 行发送到另一条路径
  3. 在每个路径中,使用派生列转换或脚本转换,通过实际分隔符拆分字符串并为该路径中的记录类型创建实际列。
  4. 继续进行其余的处理,直到它们到达各自的目的地。
于 2017-08-16T17:57:05.883 回答
0

感谢您的回复。

由于我需要 C 记录和 L 记录,因此我决定将整个输入文件加载到 SQL Server 表中。一旦它在 SQL 中,我编写了一个相当简单的存储过程来游标表中的记录,当它是 C 记录时将所需的列放入 SQL 变量中,并将来自 SQL 变量的数据和输入数据插入到输出记录中当它是 L 记录时(我试图完全在 SSIS 中做同样的事情,但无法做到)。在我的输出记录表被填充之后,编写一个数据流来选择表输出记录中的所有记录作为数据流源并将它们放入所需的平面文件作为数据源目标是一件简单的事情。

迪克·罗森伯格

于 2017-08-17T19:11:34.893 回答
0

我喜欢使用脚本组件:

第一步是添加数据流。

在数据流中添加脚本组件并选择源

在输入/输出中:添加您想要作为输出的列信息。(请注意,您将有 2 个带有许多列的独立输出)并选择您的数据类型。

现在进入脚本编辑器。

这是使用 2 个单独的 If 语句的代码

string strPath = "";
    var lines = System.IO.File.ReadAllLines(strPath);

foreach (string line in lines)
{
    if (line.Substring(1, 1) == "C")
    {
        char[] delim =  "|".ToCharArray() ;
        var C_cols = line.Split(delim);
        Output0Buffer.AddRow();
        Output0Buffer.FirstName = C_cols[0];
        Output0Buffer.LastName = int.Parse(C_cols[1]); //Note that everything is a string until cast to correct data type
        // Keep on going
    }

    if (line.Substring(1, 1) == "L")
    {
        char[] delim = "|".ToCharArray();
        var L_cols = line.Split(delim);
        Output2Buffer.AddRow();
        Output2Buffer.FirstName = L_cols[0];
        Output2Buffer.LastName = int.Parse(L_cols[1]);
        // Keep on going
    }
}

此时,脚本组件将有两个输出,可以通向不同的路径。

于 2017-08-16T19:42:25.887 回答