问题描述
我正在研究一种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];
- 您正在获取列值并将其强制转换为字符串。 (当前值为整个字符串)
- 接下来是基于'_'拆分(当前值是由三个字符串组成的数组)
- 最后,您将获取第二个值(从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));