主机和 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) 进行测试并看到它确实加入后,这是我能得出的唯一结论。

有人对此有任何经验,也许有解决方法?

建议的解决方案

只需按照以下步骤操作即可:

  1. 首先添加 2 个平面文件源 (2 CSV)
  2. 在每个连接器之后使用以下表达式为 ClientName 添加派生列转换 (删除尾随空格并更新为大写)

    UPPER(TRIM([ClientName])
    
  3. 在派生列之后添加排序组件和 Select 列 [ClientName] 排序(在每个文件上)

  4. 使用合并联接组件

如果这不起作用,则问题可能是编码差异引起的,或者是您的编辑器不可见的一些 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.1‌​02.133.24|/mwdcerv06‌​18/cerqt0618

ClientName|ResolvedClientName 
144.215.120.114|client3.nam.nsroot.net
10.102.133.‌​24|client1.nam.nsroo‌​t.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