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

时间:2015-06-29 18:10:26

标签: ssis

我有来自SQL Server Source的文本字段。这是一个电话号码字段,通常具有以下格式:

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

我试图在字段之间进行拆分,以便只显示555-555-1212

然后我接受这个字段并转换为字符串。这里的标签之间有字面上的中断返回(\ r \ n)。这里的目标是将这些数据分成多个领域(家庭,工作,细胞,紧急等)。我正在研究如何在各个领域之间分割文本,我取得了一些进展。在家庭号码的情况下,我使用了这个逻辑:

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

这很有效,因为它解析了文本返回,我得到了555-555-1212。​​

现在,在break返回之间搜索文本时遇到问题。我为工作号码尝试了相同的逻辑:

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

但是这不会起作用并导致写入我的错误重定向文件。然后我尝试插入一个中断返回来查找开头的文本

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

也没有运气。关于如何解决这个问题的任何想法。另外,我很想知道如何在最后处理紧急标题。在那种情况下,它不会成为休息回报,但我仍然想解析文本。

1 个答案:

答案 0 :(得分:3)

我看看你的数据,我看到了

主页:| 555-555-1212 |工作:| 555-555-1212 |细胞:| 555-555-1212 |紧急:| 555-555-1212

我使用竖线字符|作为占位符来分隔该字符串,这基本上就是你有空格的地方(空格,制表符,换行符等)。

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

脚本组件

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开发人员说他们不允许使用脚本任务/组件的情况,这通常是因为人们首先到达而不是最后一个。

此处的方法是在数据流上包含大量派生列组件。它不会损害性能,事实上可以让它变得更容易。它肯定会让你的调试变得更容易,因为你有很多工作要做。

DER Find Colons

这将在数据流中添加4列 - HomeColonPosition,WorkColonPosition等。您已经开始沿着此路径开始,但只是将其构建到实际数据流中,因为您需要再次引用这些位置,更容易修复填充列的计算与错误计算并在任何地方使用的计算。您可能会发现4个派生列在此处很有用,因为您希望使用前一个冒号位置作为FINDSTRING的第三个参数的起点

因此,而不是工作

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

它只是

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

只知道该字符串中4个冒号的位置,我就可以找出电话号码的位置(也许)。冒号+ 2(冒号和空格)的位置是起点,然后输出12个字符。

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