繁体   English   中英

子字符串取决于字符串中的定界符

[英]Substring depending on Delimiter in the string

我正在编写一个程序来处理SSIS中的文件名。

概述:

我在SSIS中的文本文件加载过程中正在捕获文件名。 我编写了一个过程,以便将该文件名拆分为不同的组件,并以变量的形式返回值,这将在SSIS包中进一步使用。

Problem 
This file name is of the format @FileName ="FILE_DATE_REF_DATETIME".All I need 
to split this in a way like "FILE" , "DATE". I am able to achieve this by using
SUBSTRING(@Filename,0,CHARINDEX('_',@FileName))
and 

Substring(@FileName,CHARINDEX('_',@FileName)+1,CHARINDEX('_',SUBSTRING(@Filename,CHARINDEX('_',@Filename)+1,Len(@Filename)))-1)

但是这里的主要问题是,当我们在FILE中获得一个附加的“ _”时,它完全出错了。 谁能建议我将上述文件名格式拆分为FILE和DATE的方法。

编辑

文件名样本:

  • asdfkg_20140710_ets20140710_0525_theds

  • asdjjf_they_20140710_ets20140710_0525_theds

  • oiuth_theyb_wgb_20140710_ets20140710_0526_theds

我需要在20140710和20140710之前提取所有内容。

您可以使用PATINDEX代替CHARINDEX

select SUBSTRING(@Filename,0,PATINDEX('%[_][0-9]%',@FileName))

如果文件名的最后一部分是更可靠的(没有意外下划线),你可以REVERSE并使用CHARINDEX找到第四下划线(事后再次逆转子)。

否则,如果您可以信任日期格式,则可以将PATINDEX与令人讨厌的表达式结合使用,例如

'%[_][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][_]%'

不是最漂亮的,但它将起作用。 大声笑

DECLARE @FILE VARCHAR(55) = 'FILE_DATE_REF_DATETIME'
DECLARE @FILEFUN AS VARCHAR(55) = LEFT(@FILE,CHARINDEX('_',@FILE))
DECLARE @FILENAMEOUTPUT AS TABLE(Name Varchar(55))

WHILE LEN(@FILE) > 0
BEGIN
INSERT INTO @FILENAMEOUTPUT
SELECT REPLACE(@FILEFUN,'_','')
SET @FILE = REPLACE(@FILE,@FILEFUN,'')
SET @FILEFUN = iif(CHARINDEX('_',@FILE)=0,@FILE,LEFT(@FILE,CHARINDEX('_',@FILE)))
END

SELECT * FROM @FILENAMEOUTPUT

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM