子串从-到

问题描述

我正在研究一种SSIS(2017)解决方案,以从以下3个excel文件名读取和加载数据:

message_EDF_100420202.csv
message_UltaBIO_10042020.csv
message_SEIDV_10042020.csv

我需要做的是仅将EDF或UltraBIO或SEIDV作为新列(派生列任务)

所以我需要一些帮助来正确设置派生列任务中的substring函数

有什么建议吗?

解决方法

您的模式似乎是message_ Stuff-I-Want _junk(实际模式中不存在空格)。用下划线定界,并且由于起始文本是恒定的,因此使生活更加轻松。

创建一个名为MessageLessName的新列

使用表达式删除message_部分

REPLACE([SourceFile],"message_","")

现在,我们要在新列MessageLessName中采用最左边的N个字符,其中N对应于下划线的位置。为了便于调试,我建议您将第二个派生列任务添加到第一个(我们定义了MessageLessName的)输出中。在这里,我们将创建FirstUnderscore列

findstring([MessageLessName],"_",1)

最后,我们将添加一个 third 派生列任务,并且在此处获得最终文件名。

LEFT([MessageLessName],[FirstUnderscore])

现在由于我的懒惰而可能会出现一个错误,但是由于您可以检查整个过程中的每个步骤,因此可以验证MessageLessName是否正是您认为的样子,并且在我们的MessageLessName列中,FirstUnderscore是N个字符。

,

使用Split的脚本组件。

Row.ColumnName.ToString().Split('_')[1];
  1. 您正在获取列值并将其强制转换为字符串。 (当前值为整个字符串)
  2. 接下来是基于'_'拆分(当前值是由三个字符串组成的数组)
  3. 最后,您将获取第二个值(从0开始)(当前值是您想要的字符串)

这里有一点奖金。以及获取日期:

    string[] breakdown = Row.fileNames.Split('_');
    Row.Type = breakdown[1];

    string dateToFix = breakdown[2].Replace(".csv","");
    Row.Date = DateTime.Parse(dateToFix.Substring(0,2) +"/" 
         + dateToFix.Substring(2,2) + "/" + dateToFix.Substring(4,4));