根据分隔符将一个字段解析为多个
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
在集成服务包中,执行以下步骤:
添加一个Data Flow Task
创建 OLEDB 连接管理器,并配置它
在 Data Flow Task
中添加一个 OLEDB Source
并选择包含您需要拆分的列的 Table
添加一个Script Component
(设置其类型为Transformation)
将OLEDB Source
连接到脚本组件
将该脚本语言更改为 Visual Basic
在Script Component
SelectColumn0
中作为Input
转到输入输出选项卡
将 8 列添加到 Output0
(例如:outColumn0, outColumn1 ... outColumn8
),数据类型为 DT-STR
在脚本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,我们添加缺失的竖线,然后拆分列并将其分配给输出列。
我正在尝试找出一种使用 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
在集成服务包中,执行以下步骤:
添加一个
Data Flow Task
创建 OLEDB 连接管理器,并配置它
在
Data Flow Task
中添加一个OLEDB Source
并选择包含您需要拆分的列的 Table添加一个
Script Component
(设置其类型为Transformation)将
OLEDB Source
连接到脚本组件将该脚本语言更改为 Visual Basic
在
Script Component
SelectColumn0
中作为Input转到输入输出选项卡
将 8 列添加到
Output0
(例如:outColumn0, outColumn1 ... outColumn8
),数据类型为DT-STR
在脚本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,我们添加缺失的竖线,然后拆分列并将其分配给输出列。