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