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

SSIS派生列-在中断返回之间解析文本,ssis,Ssis,我有一个来自SQL Server源的文本字段。它是一个电话号码字段,通常具有以下格式: Home: 555-555-1212 Work: 555-555-1212 Cell: 555-555-1212 Emergency: 555-555-1212 我正在尝试在字段之间拆分,以便只显示555-555-1212 然后我把这个字段转换成一个字符串。这里的标签之间有确切的中断返回(\r\n)。这里的目标是在多个字段(家庭、工作、手机、紧急情况等)之间拆分数据。我正在研究如何在字段之间拆分文本,并取得

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

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

现在,我遇到了一个问题,当搜索一个文本之间的中断返回。我对工作编号尝试了相同的逻辑:

 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)

那里也没有运气。关于我如何解决这个问题的任何想法。另外,我希望能在最后告诉你我如何处理紧急事件。在这种情况下不会出现中断返回,但我仍然希望解析文本。

我查看了您的数据,发现

家:| 555-555-1212 |工作:| 555-555-1212 |牢房:| 555-555-1212 |紧急情况:| 555-555-1212

我使用管道字符|作为占位符,用于分割该字符串,基本上就是有空格(空格、制表符、换行符等)的地方

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

脚本组件 他是你的朋友。看看它对源数据做了什么

我添加了一个新的脚本组件,作为一个转换,并创建了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开发人员说他们不允许使用脚本任务/组件,这通常是因为人们首先接触到它们,而不是最后一个

这里的方法是在数据流上有很多派生列组件。这不会影响性能,事实上可以让它变得更容易。它肯定会使您的调试更容易,因为您将有很多事情要做

查找冒号 这将向数据流中添加4列—HomeColonPosition、WorkColonPosition等。您已经沿着这条路径开始了,但只需将其构建到实际的数据流中,因为您需要引用这些位置,并且再次强调,修复填充列的计算比修复错误且到处使用的计算更容易。您可能会发现这里有4个派生列很有用,因为您希望使用前面冒号的位置作为
FINDSTRING的第三个参数的起点

因此,与其说是工作

FINDSTRING(PhoneData, ":", FINDSTRING(PhoneData, ":" 1) + 1)
那就是

FINDSTRING(PhoneData, ":", HomeColonPosition + 1)
只要知道字符串中4个冒号的位置,我就可以知道电话号码在哪里(也许)。冒号+2(冒号和空格)的位置是起始点,然后超出12个字符


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

不幸的是,我发现数据非常不一致,因为它是一个自由文本字段。我最终确实创建了多个条件拆分和派生列来完成我所需要的。