主机和 IP 混合的 SSIS 合并加入列
SSIS Merge Join on Column with Host and IP mixed
需要一些帮助来弄清楚为什么 Merge Join 操作在加入我的专栏中的 IP 地址时遇到问题。
我有 2 个 CSV 文件,其中包含以下信息,连接列是 ClientName,总体目标是获得
Array|ClientName|ResolvedClientName|Path
来自我的合并连接。
CSV1
Array | ClientName | Path
___________|________________|______________________
myArray1 | server1 | /something/something
myArray1 | server2 | /something/something
myArray1 | 192.168.0.55 | /something/something
myArray2 | 192.172.6.10 | /something/something
myArray2 | server5 | /something/something
CSV2
ClientName | ResolvedClientName
_______________|______________________
server1 | server1
server2 | server2
192.168.0.55 | server3
192.172.6.10 | server4
server5 | server5
将它们拉入并对它们执行 Merge Join 非常简单,连接上的输出都是字符串,并且操作在只有文本的那些上效果很好 (server1/2/5)。然而,它在 IP 地址上分崩离析,这似乎是由于“.”。在他们中。在对两者中的一组随机数字 (12345) 进行测试并看到它确实加入后,这是我能得出的唯一结论。
有人对此有任何经验,也许有解决方法?
建议的解决方案
只需按照以下步骤操作即可:
- 首先添加 2 个平面文件源 (2 CSV)
在每个连接器之后使用以下表达式为 ClientName
添加派生列转换 (删除尾随空格并更新为大写)
UPPER(TRIM([ClientName])
在派生列之后添加排序组件和 Select 列 [ClientName]
按 排序(在每个文件上)
使用合并联接组件
如果这不起作用,则问题可能是编码差异引起的,或者是您的编辑器不可见的一些 unicode 字符导致了此问题
更新 1
基于 OP 评论:if you were to try these 2 cases in a CSV file I believe you'd see the same results I am, first one works, second one doesn't...
ArrayName|ClientName|MountPath
array2.nam.nsroot.net|144.215.120.114|/mwdctov0285/ctoqt0285
array1-pr.nam.nsroot.net|10.102.133.24|/mwdcerv0618/cerqt0618
ClientName|ResolvedClientName
144.215.120.114|client3.nam.nsroot.net
10.102.133.24|client1.nam.nsroot.net`
解法:
得到这个示例数据后,我直接从你的评论中复制它们到我的 Notepad++ 编辑器中,我发现有一些 unicode 字符显示为问号,这将导致值之间的差异
一个建议是在每个源之后添加一个脚本组件,并使用脚本来获得一个新的输出列(派生列可以被删除)
示例:
If Not Row.ClientName_IsNull AndAlso _
Not String.IsnullOrEmpty(Row.ClientName) Then
Row.OutClientName = Regex.Replace(Row.ClientName, "[^0-9.]", "").ToUpper
Else
Row.OutClientName_IsNull = True
End If
注意:您必须导入 System.Text.RegularExpressions
才能使用 RegEx
需要一些帮助来弄清楚为什么 Merge Join 操作在加入我的专栏中的 IP 地址时遇到问题。
我有 2 个 CSV 文件,其中包含以下信息,连接列是 ClientName,总体目标是获得
Array|ClientName|ResolvedClientName|Path
来自我的合并连接。
CSV1
Array | ClientName | Path
___________|________________|______________________
myArray1 | server1 | /something/something
myArray1 | server2 | /something/something
myArray1 | 192.168.0.55 | /something/something
myArray2 | 192.172.6.10 | /something/something
myArray2 | server5 | /something/something
CSV2
ClientName | ResolvedClientName
_______________|______________________
server1 | server1
server2 | server2
192.168.0.55 | server3
192.172.6.10 | server4
server5 | server5
将它们拉入并对它们执行 Merge Join 非常简单,连接上的输出都是字符串,并且操作在只有文本的那些上效果很好 (server1/2/5)。然而,它在 IP 地址上分崩离析,这似乎是由于“.”。在他们中。在对两者中的一组随机数字 (12345) 进行测试并看到它确实加入后,这是我能得出的唯一结论。
有人对此有任何经验,也许有解决方法?
建议的解决方案
只需按照以下步骤操作即可:
- 首先添加 2 个平面文件源 (2 CSV)
在每个连接器之后使用以下表达式为
ClientName
添加派生列转换 (删除尾随空格并更新为大写)UPPER(TRIM([ClientName])
在派生列之后添加排序组件和 Select 列
[ClientName]
按 排序(在每个文件上)使用合并联接组件
如果这不起作用,则问题可能是编码差异引起的,或者是您的编辑器不可见的一些 unicode 字符导致了此问题
更新 1
基于 OP 评论:if you were to try these 2 cases in a CSV file I believe you'd see the same results I am, first one works, second one doesn't...
ArrayName|ClientName|MountPath
array2.nam.nsroot.net|144.215.120.114|/mwdctov0285/ctoqt0285
array1-pr.nam.nsroot.net|10.102.133.24|/mwdcerv0618/cerqt0618
ClientName|ResolvedClientName
144.215.120.114|client3.nam.nsroot.net
10.102.133.24|client1.nam.nsroot.net`
解法:
得到这个示例数据后,我直接从你的评论中复制它们到我的 Notepad++ 编辑器中,我发现有一些 unicode 字符显示为问号,这将导致值之间的差异
一个建议是在每个源之后添加一个脚本组件,并使用脚本来获得一个新的输出列(派生列可以被删除)
示例:
If Not Row.ClientName_IsNull AndAlso _
Not String.IsnullOrEmpty(Row.ClientName) Then
Row.OutClientName = Regex.Replace(Row.ClientName, "[^0-9.]", "").ToUpper
Else
Row.OutClientName_IsNull = True
End If
注意:您必须导入 System.Text.RegularExpressions
才能使用 RegEx