根据分隔符将一个字段解析为多个

Parse one field into several, based on delimiter

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

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

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

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

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

更新

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

您可以使用脚本组件执行此操作

在这个答案中,我假设数据源是一个 SQL 服务器 Table,只有一列 Column0

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

  1. 添加一个Data Flow Task

  2. 创建 OLEDB 连接管理器,并配置它

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

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

  5. OLEDB Source连接到脚本组件

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

  7. Script ComponentSelectColumn0中作为Input

  8. 转到输入输出选项卡

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

  10. 在脚本window中编写如下脚本:

    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,我们添加缺失的竖线,然后拆分列并将其分配给输出列。