我试图找出如何拆分表中的列,并将结果导出到 CSV 文件后将其拆分为三列。
例如,我有一个名为 fullpatientname 的字段。它以以下文本格式列出:
Smith, John C
期望将它放在三个单独的列中:
Smith
John
C
我很确定我必须将其拆分为派生列,但我不确定如何继续
我试图找出如何拆分表中的列,并将结果导出到 CSV 文件后将其拆分为三列。
例如,我有一个名为 fullpatientname 的字段。它以以下文本格式列出:
Smith, John C
期望将它放在三个单独的列中:
Smith
John
C
我很确定我必须将其拆分为派生列,但我不确定如何继续
您将需要为此过程使用派生列。
SUBSTRING 和 FINDSTRING 函数将是实现这一目标的关键。
要获得第一段,您将使用如下内容:
(DT_STR,25,1252) SUBSTRING([fullpatientname], 1, FINDSTRING(",",[fullpatientname],1)-1)
上面应该显示一个子字符串,从 [fullpatientname] 的开头到逗号 (,) 之前的位置。
下一段将是从逗号之后的位置到最后一个空格分隔符,而最后一段将是从最后一个空格分隔符之后的位置到结尾的所有内容。
听起来您的业务规则是
这种逻辑会以很多有趣的方式失败,所以要做好准备。还要记住,一旦将信息组合在一起,就不能以 100 的准确度将其还原到组成部分。捕获第一名、中间名、姓氏/姓氏并将它们分开存储。
派生的列组件。实际上,添加到您的数据流中的其中一些将涵盖这一点。第一个派生列的任务是查找名称中断的位置。这可以在单个组件中完成,但调试成为一项挑战,然后您将需要在一行中多次引用相同的表达式 * 3 它很快成为维护的噩梦。
然后,第二个派生列将使用第一个中定义的位置调用LEFT
和SUBSTRING
函数来访问列中的点
我从来没有先接触过脚本组件,你也应该如此。但是,这对于脚本来说是一个非常好的案例。基本的 .NET 字符串库有一个 Split 函数,它可以根据您提供的任何分隔符将字符串分成几部分。默认值为空格。第一次调用 split 将使用 ',' 作为参数。第零个序数字符串将是姓氏。第一个序号字符串将包含名字和中间名片段。再次调用 string.Split 方法,这次使用默认值,最后一个元素是中间名,其余元素称为名字。反之亦然,第零个元素是第一个名称,其他所有元素都是最后一个。
我之前不得不处理清洁名称,因此我看到了基于他们希望如何标准化名称的不同规则。
如果您的姓名始终采用相同的格式(LastName-comma-space-FirstName-space-MI),请尝试这样的操作:
declare @FullName varchar(25) = 'Smith, John C'
select
substring(@FullName, 1, charindex(',', @FullName)-1 ) as LastName,
substring(@FullName, charindex(',',@FullName) + 2, charindex(' ',@FullName,charindex(',',@FullName)+2) - (charindex(',',@FullName) + 2) ) as FirstName,
substring(@FullName, len(@FullName), 1) as MiddleInitial
我在 Visual Studio 2015 中使用带有 SSIS 的 SQL SERVER 2016。如果您使用的是 findstring,则需要确保顺序正确。我首先尝试了这个 - FINDSTRING(",",[fullpatientname],1),但它不起作用。我不得不查找文档并发现顺序不正确。FINDSTRING([fullpatientname],",",1) 为我解决了这个问题。我不确定这是否是由于版本差异造成的。