SSIS 派生列 - 在中断 returns 之间解析文本

SSIS Derived Column - Parse Text between break returns

我有一个来自 SQL 服务器源的文本字段。它是一个 phone 数字字段,通常具有以下格式:

Home: 555-555-1212
Work: 555-555-1212
Cell: 555-555-1212
Emergency: 555-555-1212

我正在尝试拆分字段以便仅显示 555-555-1212

然后我将这个字段转换为字符串。这里的标签之间确实有 break returns (\r\n)。这里的目标是将这些数据拆分到多个字段(家庭、工作、手机、紧急情况等)中。我正在研究如何在字段之间拆分文本,我取得了一些进展。在家庭号码的情况下,我使用了这个逻辑:

SUBSTRING(Phone_converted,FINDSTRING(Phone_converted,"Home:",1) + 5,FINDSTRING(Phone_converted,"\n",1) - FINDSTRING(Phone_converted,"Home:",1) - 5)

这很好用,因为它解析文本 return,我得到 555-555-1212。​​

现在我在 break returns 之间搜索文本时遇到问题。我对工作编号尝试了相同的逻辑:

 SUBSTRING(Phone_converted,FINDSTRING(Phone_converted,"Work:",1) + 5,FINDSTRING(Phone_converted,"\n",1) - FINDSTRING(Phone_converted,"Work:",1) - 5)

但这不起作用并导致写入我的错误重定向文件。然后我尝试插入一个中断 return 以找到开头的文本

SUBSTRING(Phone_converted,FINDSTRING(Phone_converted,"\nWork:",1) + 5,FINDSTRING(Phone_converted,"\n",1) - FINDSTRING(Phone_converted,"\nWork:",1) - 5)

也不走运。关于如何解决这个问题的任何想法。另外,我将很感激最后如何处理紧急标题的想法。在那种情况下不会有中断return,但我仍然想解析文本。

我看了你的数据我明白了

家:|555-555-1212|工作:|555-555-1212|手机:|555-555-1212|紧急情况:|555-555-1212

我使用竖线字符 | 作为占位符来表示我将在何处分割该字符串,这基本上是您有白色的地方space(space、制表符、换行符等).

有两种方法。我将从简单的开始。

脚本组件

String.Split 是你的朋友。看看它对源数据做了什么

我添加了一个新的脚本组件,充当转换并创建了 4 个输出列,所有字符串的长度均为 12,代码页为 1252:Home、Work、Cell 和 Emergency。我像这样填充它们

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    string[] split = Row.PhoneData.Split();

    Row.Home = split[1];
    Row.Work = split[4];
    Row.Cell = split[7];
    Row.Emergency = split[10];
}

派生列

我不打算为此构建一个完整的实现。上面的内容非常简单,但我 运行 遇到 ETL 开发人员说他们不允许使用脚本 tasks/components 的情况,这通常是因为人们首先而不是最后才接触到它们。

此处的方法是在您的数据流中包含大量派生列组件。它不会影响性能,实际上可以使它更容易。它 肯定 会让你的调试更容易,因为你有很多事情要做。

DER 查找冒号

这会在数据流中添加 4 列 - HomeColonPosition、WorkColonPosition 等。您已经沿着这条路开始,但只需将其构建到实际数据流中,因为您需要引用这些位置,而且,它是修复填充列的计算比修复错误且随处使用的计算更容易。您可能会发现 4 个派生列在这里很有用,因为您希望使用前一个冒号的位置作为 FINDSTRING

的第三个参数的起点

因此,工作不是

FINDSTRING(PhoneData, ":", FINDSTRING(PhoneData, ":" 1) + 1)

它只是

FINDSTRING(PhoneData, ":", HomeColonPosition + 1)

只要知道该字符串中 4 个冒号的位置,我就可以找出 phone 数字的位置(也许)。冒号+2的位置(冒号加space)就是起点再往外走12个字符。

当数据不一致时,这种方法变得丑陋,就像它使用脚本方法一样。