我有来自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)
也没有运气。关于如何解决这个问题的任何想法。另外,我很想知道如何在最后处理紧急标题。在那种情况下,它不会成为休息回报,但我仍然想解析文本。
答案 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开发人员说他们不允许使用脚本任务/组件的情况,这通常是因为人们首先到达而不是最后一个。
此处的方法是在数据流上包含大量派生列组件。它不会损害性能,事实上可以让它变得更容易。它肯定会让你的调试变得更容易,因为你有很多工作要做。
这将在数据流中添加4列 - HomeColonPosition,WorkColonPosition等。您已经开始沿着此路径开始,但只是将其构建到实际数据流中,因为您需要再次引用这些位置,更容易修复填充列的计算与错误计算并在任何地方使用的计算。您可能会发现4个派生列在此处很有用,因为您希望使用前一个冒号位置作为FINDSTRING
的第三个参数的起点
因此,而不是工作
FINDSTRING(PhoneData, ":", FINDSTRING(PhoneData, ":" 1) + 1)
它只是
FINDSTRING(PhoneData, ":", HomeColonPosition + 1)
只知道该字符串中4个冒号的位置,我就可以找出电话号码的位置(也许)。冒号+ 2(冒号和空格)的位置是起点,然后输出12个字符。
这种方法变得丑陋,就像脚本方法那样,当数据不一致时。