从 SSIS 派生列中的字符串中删除文本
Remove Text from a String in SSIS derived column
我正在尝试从入站数据中删除一些不需要的文本值。收到的数据如下所示:
string;#0 Day(s), 08 Hours, 15 Minutes
我在派生列转换中应用了它:
SUBSTRING([Modified By], FINDSTRING([Modified By],"#",1) + 1, FINDSTRING([Modified By],"#", 1))
仅获取 #
之后的内容
结果是:0 Day(s)
但你看我遗漏了其余部分,我试图在 #
之后获取所有内容 => 0 Day(s), 08 Hours, 15 Minutes
我想,这就是你想要的:
SUBSTRING([Modified By],FINDSTRING([Modified By],"#",1) + 1,LEN([Modified By]) - (FINDSTRING([Modified By],"#",1) + 1) )
鉴于您的文本格式为
string;#0 Day(s), 08 Hours, 15 Minutes
希望删除从 #
到字符串开头的所有内容,包括结束点,我会考虑使用 RIGHT 运算符。我想要最右边的字符从 # 的位置开始到结尾。
我发现将这些事情分解成许多步骤很有帮助,尤其是对于调试。
DER 计算#位置
我创建了一个派生列来计算 # 的位置。这是一个基于 1 的序数系统,因此我应该根据上述得到值 8。我在派生列组件中添加了一个名为 SharpPosition
Int32
数据类型的新列
FINDSTRING([Modified By],"#",1)
给定一个样本,我们不知道是否需要考虑源数据中的 NULL,或者 # 是否会一直存在。采用这样的方法通常很有帮助,因为它可以让您识别表达式中中断的特定部分。
DER 结果字符串长度
在这里,我计算生成的字符串长度,以便最终操作更容易。同样,简单的安全检查以确保我有正确的值。新列 ResultingLength
,表达式为
LEN([Modified By]) - [SharpPosition]
DER 权利修改者
最后,我们有了拼图,我们需要确定我们需要修改的原始字符串中的位置。
我创建了一个名为 ModInfo 的字符串列,长度为 50 并使用了以下表达式
RIGHT([Modified By], [ResultingLength])
您可以将所有这些汇总到一个表达式中,但正如我一直提到的,我发现这种方法的维护更容易。
比姆
没有一些代码来重现结果的答案是什么,嗯?如果您还没有安装免费扩展 BIDS Helper,请安装它。
现在您已经安装了 BIDS Helper,右键单击您的项目并select添加新的 Biml 文件。
在生成的 BimlScript.biml 文件中,粘贴以下内容。
调整第 3 行以指向 SQL 服务器的一个实例。根据您的版本,您可能还需要从 SQLNCLI11.1 更新提供程序以匹配您的实例。
完成后,右键单击 biml 文件并 select 生成 SSIS 包。弹出一个闪亮的新 SSIS 包,其中包含所有正确的组件和表达式。
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<Connections>
<Connection Name="tempdb" ConnectionString="Data Source=localhost\dev2012;Initial Catalog=tempdb;Provider=SQLNCLI11.1;Integrated Security=SSPI;" />
</Connections>
<Packages>
<Package Name="so_33020866">
<Tasks>
<Dataflow Name="DFT Demo">
<Transformations>
<OleDbSource ConnectionName="tempdb" Name="OLE_SRC Demo">
<DirectInput>SELECT 'string;#0 Day(s), 08 Hours, 15 Minutes' AS [Modified By] UNION ALL SELECT NULL UNION ALL SELECT ''</DirectInput>
</OleDbSource>
<DerivedColumns Name="DER Calculate # position">
<Columns>
<Column DataType="Int32" Name="SharpPosition">FINDSTRING([Modified By],"#",1)</Column>
</Columns>
</DerivedColumns>
<DerivedColumns Name="DER Resulting String Length">
<Columns>
<Column DataType="Int32" Name="ResultingLength">LEN([Modified By]) - [SharpPosition]</Column>
</Columns>
</DerivedColumns>
<DerivedColumns Name="DER Right Modified By">
<Columns>
<Column DataType="String" Name="ModInfo" Length="50">RIGHT([Modified By], [ResultingLength])</Column>
</Columns>
</DerivedColumns>
<DerivedColumns Name="DER PlaceHolder"></DerivedColumns>
</Transformations>
</Dataflow>
</Tasks>
</Package>
</Packages>
</Biml>
结果
你可以看到我模拟了你的源字符串,一个没有#和一个NULL的字符串。 None 失败。
我认为这个表达式可以正常工作。
在派生列表达式中写入此表达式。
SUBSTRING([修改者],FINDSTRING([修改者],"#",1) + 1,len([修改者]))
我正在尝试从入站数据中删除一些不需要的文本值。收到的数据如下所示:
string;#0 Day(s), 08 Hours, 15 Minutes
我在派生列转换中应用了它:
SUBSTRING([Modified By], FINDSTRING([Modified By],"#",1) + 1, FINDSTRING([Modified By],"#", 1))
仅获取 #
结果是:0 Day(s)
但你看我遗漏了其余部分,我试图在 #
之后获取所有内容 => 0 Day(s), 08 Hours, 15 Minutes
我想,这就是你想要的:
SUBSTRING([Modified By],FINDSTRING([Modified By],"#",1) + 1,LEN([Modified By]) - (FINDSTRING([Modified By],"#",1) + 1) )
鉴于您的文本格式为
string;#0 Day(s), 08 Hours, 15 Minutes
希望删除从 #
到字符串开头的所有内容,包括结束点,我会考虑使用 RIGHT 运算符。我想要最右边的字符从 # 的位置开始到结尾。
我发现将这些事情分解成许多步骤很有帮助,尤其是对于调试。
DER 计算#位置
我创建了一个派生列来计算 # 的位置。这是一个基于 1 的序数系统,因此我应该根据上述得到值 8。我在派生列组件中添加了一个名为 SharpPosition
Int32
FINDSTRING([Modified By],"#",1)
给定一个样本,我们不知道是否需要考虑源数据中的 NULL,或者 # 是否会一直存在。采用这样的方法通常很有帮助,因为它可以让您识别表达式中中断的特定部分。
DER 结果字符串长度
在这里,我计算生成的字符串长度,以便最终操作更容易。同样,简单的安全检查以确保我有正确的值。新列 ResultingLength
,表达式为
LEN([Modified By]) - [SharpPosition]
DER 权利修改者
最后,我们有了拼图,我们需要确定我们需要修改的原始字符串中的位置。
我创建了一个名为 ModInfo 的字符串列,长度为 50 并使用了以下表达式
RIGHT([Modified By], [ResultingLength])
您可以将所有这些汇总到一个表达式中,但正如我一直提到的,我发现这种方法的维护更容易。
比姆
没有一些代码来重现结果的答案是什么,嗯?如果您还没有安装免费扩展 BIDS Helper,请安装它。
现在您已经安装了 BIDS Helper,右键单击您的项目并select添加新的 Biml 文件。
在生成的 BimlScript.biml 文件中,粘贴以下内容。
调整第 3 行以指向 SQL 服务器的一个实例。根据您的版本,您可能还需要从 SQLNCLI11.1 更新提供程序以匹配您的实例。
完成后,右键单击 biml 文件并 select 生成 SSIS 包。弹出一个闪亮的新 SSIS 包,其中包含所有正确的组件和表达式。
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<Connections>
<Connection Name="tempdb" ConnectionString="Data Source=localhost\dev2012;Initial Catalog=tempdb;Provider=SQLNCLI11.1;Integrated Security=SSPI;" />
</Connections>
<Packages>
<Package Name="so_33020866">
<Tasks>
<Dataflow Name="DFT Demo">
<Transformations>
<OleDbSource ConnectionName="tempdb" Name="OLE_SRC Demo">
<DirectInput>SELECT 'string;#0 Day(s), 08 Hours, 15 Minutes' AS [Modified By] UNION ALL SELECT NULL UNION ALL SELECT ''</DirectInput>
</OleDbSource>
<DerivedColumns Name="DER Calculate # position">
<Columns>
<Column DataType="Int32" Name="SharpPosition">FINDSTRING([Modified By],"#",1)</Column>
</Columns>
</DerivedColumns>
<DerivedColumns Name="DER Resulting String Length">
<Columns>
<Column DataType="Int32" Name="ResultingLength">LEN([Modified By]) - [SharpPosition]</Column>
</Columns>
</DerivedColumns>
<DerivedColumns Name="DER Right Modified By">
<Columns>
<Column DataType="String" Name="ModInfo" Length="50">RIGHT([Modified By], [ResultingLength])</Column>
</Columns>
</DerivedColumns>
<DerivedColumns Name="DER PlaceHolder"></DerivedColumns>
</Transformations>
</Dataflow>
</Tasks>
</Package>
</Packages>
</Biml>
结果
你可以看到我模拟了你的源字符串,一个没有#和一个NULL的字符串。 None 失败。
我认为这个表达式可以正常工作。
在派生列表达式中写入此表达式。
SUBSTRING([修改者],FINDSTRING([修改者],"#",1) + 1,len([修改者]))