【问题标题】:SSIS - Open XML file, find string between 2 strings and left the found stringSSIS - 打开 XML 文件,在 2 个字符串之间查找字符串并留下找到的字符串
【发布时间】:2020-12-11 12:51:14
【问题描述】:

我有一个包含多条记录的 XML 文件。我有一个实现的过程,该过程获取该文件并将其插入到表中。 问题是描述列中有一个几乎 20000 个字符长的 xml 记录。 我想做的是有一个可以打开文件的过程,在 和 字符串之间查找长度超过 255 个字符的字符串,并将字符串的左侧设为 255。最后我保存了所做的更改后的文件。

示例:

我在文件中有:

<Row>
    <Attributes>
        <Column>
            <Name>Column1</Name>
            <Value>111111</Value>
        </Column>
        <Column>
            <Name>Column2</Name>
            <Value>AAAAAA</Value>
        </Column>
        <Column>
            <Name>Column3</Name>
            <Value>XXXX</Value>
        </Column>
        <Column>
            <Name>Column4</Name>
            <Value>XXXXXX</Value>
        </Column>
        <Column>
            <Name>Column5</Name>
            <Value>FGGGGG</Value>
        </Column>
        <Column>
            <Name>Description</Name>
            <Value>PING10,10,10,10TESTEREMOTE,PING20,20,20,20TESTEREMOTE,PING30,30,30,30TESTEREMOTEPING10,10,10,10TESTEREMOTE,PING20,20,20,20TESTEREMOTE,PINGPING10,10,10,10TESTEREMOTE,PING20,20,20,20TESTEREMOTE,PING30,30,30,30TESTEREMOTE30,30,30,30TESTEREMOTE</Value>
        </Column>
        <Column>
            <Name>COLUMN6</Name>
            <Value>XX</Value>
        </Column>
    </Attributes>
</Row>

我想要:

之间找到大字符串,并把字符串留到250个字符内。

Column1111111Column2AAAAAA列3名称>XXXX值>列>列4名称>XXXXXX值>列>列5FGGGGG值>列>描述名称>PING 10,10,10,10 TESTE远程,PING 20,20,20,20 测试远程,PING 30,30,30,30 测试远程 PING 10,10,10,10 测试远程,PING 20,20,20,20 测试远程,PING PING 10,10 ,10,10 TESTE REMOTE, PING 20,20,20,20 TESTE REMOTE, PING 30,30,30,30 TESTE REMOTECOLUMN6XX值>列>属性>行>

谢谢

【问题讨论】:

  • 我猜你可以在派生列转换中简单地做到这一点。使用LEFT 列的Value
  • 但这必须在文件中完成,因为如果我制作一个提取平面文件,它会出错,因为只允许包含 8000 个字符的列,而在我的情况下它有 22000 个。
  • 你的意思是你正在使用Flat file source?如果是这样,你可以直接使用XML source,你没有这样的限制
  • 你的标签中真的有那个空格吗?
  • 没有空格。我把它拿来拿标签。

标签: ssis script-task


【解决方案1】:

在处理 XML 时,我总是遵循 C#。所以这是解决方案:

创建脚本组件源: 将您的两个输出列名称/值都设置为字符串长度 50

输入代码:

添加以下命名空间:

using System.Xml.Serialization;
using System.Collections.Generic;

创建一个类对象让 XML 序列化成

[XmlRoot(ElementName = "Column")]
public class Column
{
    [XmlElement(ElementName = "Name")]
    public string Name { get; set; }
    [XmlElement(ElementName = "Value")]
    public string Value { get; set; }
}

[XmlRoot(ElementName = "Attributes")]
public class Attributes
{
    [XmlElement(ElementName = "Column")]
    public List<Column> Column { get; set; }
}

[XmlRoot(ElementName = "Row")]
public class Row
{
    [XmlElement(ElementName = "Attributes")]
    public List<Attributes> Attributes { get; set; }
}

并在创建新的输出行中添加:

    string xml = @"<Row>
                            <Attributes>
                                <Column>
                                    <Name>Column1</Name>
                                    <Value>111111</Value>
                                </Column>
                                <Column>
                                    <Name>Column2</Name>
                                    <Value>AAAAAA</Value>
                                </Column>
                                <Column>
                                    <Name>Column3</Name>
                                    <Value>XXXX</Value>
                                </Column>
                                <Column>
                                    <Name>Column4</Name>
                                    <Value>XXXXXX</Value>
                                </Column>
                                <Column>
                                    <Name>Column5</Name>
                                    <Value>FGGGGG</Value>
                                </Column>
                                <Column>
                                    <Name>Description</Name>
                                    <Value>PING10,10,10,10TESTEREMOTE,PING20,20,20,20TESTEREMOTE,PING30,30,30,30TESTEREMOTEPING10,10,10,10TESTEREMOTE,PING20,20,20,20TESTEREMOTE,PINGPING10,10,10,10TESTEREMOTE,PING20,20,20,20TESTEREMOTE,PING30,30,30,30TESTEREMOTE30,30,30,30TESTEREMOTE</Value>
                                </Column>
                                <Column>
                                    <Name>COLUMN6</Name>
                                    <Value>XX</Value>
                                </Column>
                            </Attributes>
                        </Row>";

    System.IO.MemoryStream stream = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(xml));

    XmlSerializer serializer = new XmlSerializer(typeof(Row));
    var x = (Row)serializer.Deserialize(stream);

    foreach (var att in x.Attributes)
        foreach (var col in att.Column)
        {
            Output0Buffer.AddRow();
            Output0Buffer.name = col.Name;
            Output0Buffer.value = col.Value.Substring(0, Math.Min(30, col.Value.Length));
        }

注意事项:

  1. 我选择了 30 的长度,您可以将其更改为任何您想要的长度
  2. 您可以轻松地将文件加载到内存流中,而不是转换字符串

最终输出(基于 30)

【讨论】:

  • 嗨 Keith,您可以与我分享您参加考试的包裹。我会更容易理解。谢谢
  • 我从来没有试过这个,但我把它放在我的保管箱里。 dropbox.com/s/ffbo4kcdff14if2/SO.dtsx?dl=0
  • 谢谢。完美。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-07
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
相关资源
最近更新 更多