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个字符。
当数据不一致时,这种方法变得丑陋,就像它使用脚本方法一样。
我有一个来自 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个字符。
当数据不一致时,这种方法变得丑陋,就像它使用脚本方法一样。