【问题标题】:Substring depending on Delimiter in the string子字符串取决于字符串中的分隔符
【发布时间】:2014-08-11 01:39:40
【问题描述】:

我正在编写一个程序来处理 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 之前的任何内容。

【问题讨论】:

  • 编辑您的问题并显示文件名示例和您要提取的部分。
  • 如何使用脚本任务和正则表达式提取所需的详细信息?这是一个选择吗?
  • 看起来文件名格式与示例显示的不匹配,例如格式中DATETIME 的最后一部分只是theds(这怎么可能是日期时间?),@ 987654325@ 部分不应有任何下划线,但看起来它可能有一些,如示例所示(ets20140710_0525,...),我想这里的DATE 部分是20140710。因此,由于REF,问题变得比您试图解释的更复杂(尚不清楚它是否可能包含 1 个或更多下划线)。

标签: sql sql-server stored-procedures sql-server-2012 ssis


【解决方案1】:

您可以使用PATINDEX 而不是CHARINDEX 来做到这一点

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

【讨论】:

  • 这里的_ 是通配符,而不是文字字符_,这意味着 asdfkg_20140710_ets20140710_0525_theds 和 asdfkgs20140710_ets20140710_0525_theds 具有相同的结果(注意关于 在后一个文件名中替换为_)
  • 我也刚刚尝试过,看起来[0..9] 不像它应该在正则表达式中那样工作,这里的模式只有4个字符0,.,. , 和9(将选择其中一个来匹配当前字符)。
【解决方案2】:

如果文件名的最后一部分更可靠(没有意外的下划线),您可以REVERSE 它并使用CHARINDEX 找到第四个下划线(然后再次反转子字符串)。

否则,如果您可以信任日期格式,您可以使用PATINDEX 与可怕的表达类似

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

【讨论】:

  • 使用REVERSE 的方法是一个很好的解决方法,但看起来仍然不清楚它在这种情况下是否可用(正如我在OP 的问题下评论的那样),REF 部分不应包含任何下划线或者至少我们应该知道它是否总是包含固定个下划线。示例文件名显示它可能包含下划线。看起来在这里使用 PATINDEX 更好。
【解决方案3】:

不是最漂亮的,但它会起作用。哈哈

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

【讨论】:

    猜你喜欢
    • 2018-02-05
    • 2015-08-01
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 2017-06-27
    • 1970-01-01
    相关资源
    最近更新 更多