0

我收到一个 Unicode 文本平面文件,其中一列是单个固定长度值,另一列包含由垂直管道“|”分隔的列表值。第二列的长度和它包含的分隔值的数量会有很大的不同。在某些情况下,该列的宽度最多为 50000 个字符,并且可能包含一千个或更多分隔值。

输入文件示例:

[ObjectGUID]; [member]
{BD3481AF8-2CDG-42E2-BA93-73952AFB41F3}; CN=rGlynn SrechrshiresonIII,OU=Users,OU=PRV,OU=LOL,DC=ent,DC=keke,DC=cqb,DC=corp
{AC365A4F8-2CDG-42E2-BA33-73933AFB41F3}; CN=reeghler Johnson,OU=Users,OU=PRV,OU=LOL,DC=ent,DC=keke,DC=cqb,DC=corp|CN=rCoefler Cellins,OU=Users,OU=PRV,OU=LOL,DC=ent,DC=keke,DC=cqb,DC=corp|CN=rDasije M. Delmogeroo,OU=Users,OU=PRV,OU=LOL,DC=ent,DC=keke,DC=cqb,DC=corp|CN=rCurry T. Carrollton,OU=Users,OU=PRV,OU=LOL,DC=ent,DC=keke,DC=cqb,DC=corp|CN=yMica Macintosh,OU=Users,OU=PRV,OU=LOL,DC=ent,DC=keke,DC=cqb,DC=corp

我的想法是对该列执行拆分操作并为每个值创建一个新行。我正在尝试使用脚本组件来执行拆分。

分隔列的宽度很容易超过 DT-WSTR 的 4000 个字符的限制,所以我选择了 NTEXT 作为数据类型。这会出现问题,因为我熟悉的 .Split 方法需要一个字符串。我正在尝试将 NTEXT 转换为脚本组件中的字符串。

这是我的代码:

public override void Input0_ProcessInputRow(Input0Buffer Row)

{
var stringMember = Row.member.ToString();
    var groupMembers =  stringMember.Split('|');
foreach (var groupMember in groupMembers)
{
    this.Output0Buffer.AddRow();
    this.Output0Buffer.objectGUID = Row.objectGUID;
    this.Output0Buffer.member = groupMember;
}

}

我试图得到的输出是这样的:

[ObjectGUID]                                [member]
{BD3481AF8-2CDG-42E2-BA93-73952AFB41F3}     CN=rGlynn SrechrshiresonIII,OU=Users,OU=PRV,OU=LOL,DC=ent,DC=keke,DC=cqb,DC=corp
{AC365A4F8-2CDG-42E2-BA33-73933AFB41F3}     CN=reeghler Johnson,OU=Users,OU=PRV,OU=LOL,DC=ent,DC=keke,DC=cqb,DC=corp
{AC365A4F8-2CDG-42E2-BA33-73933AFB41F3}     CN=rCoefler Cellins,OU=Users,OU=PRV,OU=LOL,DC=ent,DC=keke,DC=cqb,DC=corp
{AC365A4F8-2CDG-42E2-BA33-73933AFB41F3}     CN=rDasije M. Delmogeroo,OU=Users,OU=PRV,OU=LOL,DC=ent,DC=keke,DC=cqb,DC=corp
{AC365A4F8-2CDG-42E2-BA33-73933AFB41F3}     CN=rCurry T. Carrollton,OU=Users,OU=PRV,OU=LOL,DC=ent,DC=keke,DC=cqb,DC=corp
{AC365A4F8-2CDG-42E2-BA33-73933AFB41F3}     CN=yMica Macintosh,OU=Users,OU=PRV,OU=LOL,DC=ent,DC=keke,DC=cqb,DC=corp

但我实际上得到的是:

[ObjectGUID]                               [member]
{BD3481AF8-2CDG-42E2-BA93-73952AFB41F3}    Microsoft.SqlServer.Dts.Pipeline.BlobColumn
{AC365A4F8-2CDG-42E2-BA33-73933AFB41F3}    Microsoft.SqlServer.Dts.Pipeline.BlobColumn

我可能做错了什么?

4

1 回答 1

0

以下代码有效:

public override void Input0_ProcessInputRow(Input0Buffer Row)
    {

            var blobLength = Convert.ToInt32(Row.member.Length);
            var blobData = Row.member.GetBlobData(0, blobLength);
            var stringData = System.Text.Encoding.Unicode.GetString(Row.member.GetBlobData(0, Convert.ToInt32(Row.member.Length)));
            var groupMembers = stringData.Split('|');
            foreach (var groupMember in groupMembers)
                {
                    this.Output0Buffer.AddRow();
                    this.Output0Buffer.CN = Row.CN;
                    this.Output0Buffer.ObjectGUID = Row.ObjectGUID;
                    this.Output0Buffer.member = groupMember;
            }
    }

我试图像在 PowerShell 中那样执行隐式转换,但实际上只是将一些对象元数据传递给字符串输出。此方法正确拆分我的成员并构建完整的行。

于 2017-10-05T15:28:40.090 回答