【问题标题】:Parse one field into several, based on delimiter根据分隔符将一个字段解析为多个字段
【发布时间】:2017-11-11 13:00:13
【问题描述】:

我正在尝试找出一种使用 SSIS 将 1 个字段解析为 8 个不同字段的方法。我对 C# 解决方案或 VB 解决方案持开放态度。我想出了一种在 SQL Server 中执行此操作的方法,但是因为我的团队现在在 SSIS 中做很多事情,所以我希望有一个 SSIS 解决方案来保持事情的精简和高效。我在网上查了一下,在下面的链接中找到了一个选项。

Split a single column of data with comma delimiters into multiple columns in SSIS

我不确定它是如何工作的,如果它真的有效的话。我的示例数据如下所示:

Purchase | 345 | USD | GT | TF456577 | DG | 125 | KTMDC

我可以有 0 到 7 个管道字符,所以我需要将一个字段拆分为最多八个字段。

更新

哈迪,我正在做一些小的修改。您能看一下屏幕截图并告诉我这里出了什么问题吗?另外,我从未找到DT-STR 选项。也许这就是问题所在。

【问题讨论】:

    标签: sql-server vb.net ssis etl ssis-2012


    【解决方案1】:

    您可以使用脚本组件来做到这一点

    在这个答案中,我假设数据源是一个 SQL Server 表,其中有一列 Column0

    在集成服务包中,执行以下步骤:

    1. 添加Data Flow Task

    2. 创建一个 OLEDB 连接管理器,并对其进行配置

    3. Data Flow Task 中添加OLEDB Source 并选择包含您需要拆分的列的表

    4. 添加一个Script Component(将其类型设置为Transformation)

    5. OLEDB Source 连接到脚本组件

    6. 将该脚本语言更改为 Visual Basic

    7. Script Component 中选择Column0 作为输入

    8. 转到输入输出选项卡

    9. 将 8 列添加到 Output0(例如:outColumn0, outColumn1 ... outColumn8 使用 DT-STR 数据类型

    10. 在脚本窗口中编写以下脚本:

      Imports System.Linq
      
      Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
      
          If Not Row.Column0_IsNull AndAlso
              Not String.IsNullOrEmpty(Row.Column0.Trim) Then
      
              Dim strColumn As String = Row.Column0
              Dim intVerticalBarCount As Integer
      
              intVerticalBarCount = strColumn.Count(Function(x) x = CChar("|"))
      
              If intVerticalBarCount <= 8 Then strColumn = strColumn & "".PadRight((8 - intVerticalBarCount), CChar("|"))
      
              Dim strOutputColumns As String() = strColumn.Split(CChar("|"))
      
              Row.outColumn0 = strOutputColumns(0)
              Row.outColumn1 = strOutputColumns(1)
              Row.outColumn2 = strOutputColumns(2)
              Row.outColumn3 = strOutputColumns(3)
              Row.outColumn4 = strOutputColumns(4)
              Row.outColumn5 = strOutputColumns(5)
              Row.outColumn6 = strOutputColumns(6)
              Row.outColumn7 = strOutputColumns(7)
      
      
          Else
      
              Row.outColumn0_IsNull = True
              Row.outColumn1_IsNull = True
              Row.outColumn2_IsNull = True
              Row.outColumn3_IsNull = True
              Row.outColumn4_IsNull = True
              Row.outColumn5_IsNull = True
              Row.outColumn6_IsNull = True
              Row.outColumn7_IsNull = True
      
      
      
          End If
      
      
      End Sub
      

    在上面的代码中,首先我们得到列中竖线|的出现次数;如果小于 8,则添加缺失的竖线,然后拆分列并将其分配给输出列。

    【讨论】:

    • 非常感谢!!这看起来很有希望!!我星期一一回到办公室就试试!!
    猜你喜欢
    • 1970-01-01
    • 2014-10-14
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    相关资源
    最近更新 更多