SSIS数据转换 - 行到列

时间:2013-10-22 15:19:56

标签: ssis script-component

我当前的ssis项目有一个情况。我对客户数据非常擅长。 2列具有客户数据的标识符。像下面的东西。其余列有实际数据。

COLUMN A | COLUMN B
--------------------
NAME     | XYZ
ADDRESS1 | 1 STREET
ADDRESS2 | APT A    
ZIP      | 12345

挑战在于将值读入变量或列。这是执行验证所必需的。转换后,我需要以下格式的数据。

NAME | ADDRESS1 | ADDRESS2 | ZIP
--------------------------------------
XYZ  | 1 STREET | APT A    | 12345

我可能无法使用Pivot转换,因为使用脚本组件为动态列读取此数据。有谁能请我为此提供解决方案? 谢谢你的时间。

2 个答案:

答案 0 :(得分:0)

没有开箱即用的东西可以帮到你。您面临的挑战是您的键值数据具有隐式分组。也就是说,每次看到Name键时,接下来的N行都会关联到开始行。

由于您已经从脚本任务中读取数据,请执行有意义的操作,而不是在KVP中输出,将输出缓冲区重新定义为具有适当长度的Name,Address1,Address2,Zip。然后,在脚本任务中,实际上不要调用AddRow()方法,直到到达文件末尾或者遇到名称行。

答案 1 :(得分:0)

使用脚本组件。代码如下。假设:没有遗漏的字段值。这段代码将帮助您入门。之后,您需要根据您的特殊要求进行调整。

public class ScriptMain : UserComponent
{
string name = string.Empty;
string address1 = string.Empty;
string address2 = string.Empty;
string zip = string.Empty;

public override void PreExecute()
{
    base.PreExecute();
}
public override void PostExecute()
{
    base.PostExecute();
 }
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    if (Row.Key.ToUpper().Equals("NAME"))
    {
        name = Row.Value;
    }
    else if (Row.Key.ToUpper().Equals("ADDRESS1"))
    {
        address1 = Row.Value;
    }
    else if (Row.Key.ToUpper().Equals("ADDRESS2"))
    {
        address2 = Row.Value;
    }
    else if (Row.Key.ToUpper().Equals("ZIP"))
    {
        zip = Row.Value;

        OutputRowBuffer.AddRow();
        OutputRowBuffer.Name = name;
        OutputRowBuffer.Address1 = address1;
        OutputRowBuffer.Address2 = address2;
        OutputRowBuffer.Zip = zip;           
    }
}

}