我正在开发SSIS(2017(解决方案,从以下3个excel文件名读取和加载数据:
message_EDF_100420202.csv
message_UltaBIO_10042020.csv
message_SEIDV_10042020.csv
我需要做的是只获得EDF或UltraBIO或SEIDV作为新列(派生列任务(
因此,我需要一些帮助来正确设置派生列任务中的子字符串函数。
有什么建议吗?
您的模式似乎是message_Stuff-I-Want_junk(实际模式中不存在空格(。它由下划线分隔,并且由于起始文本是常量,这使生活更轻松。
创建一个名为MessageLessName 的新列
删除带有表达式的message_部分
REPLACE([SourceFile], "message_", "")
现在,我们想取最左边的N个字符,其中N对应于新列MessageLessName中下划线的位置。为了便于调试,我建议您将第二个派生列任务添加到第一个派生列的输出中(我们在其中定义了MessageLessName(。在这里,我们将创建FirstUndercore列
findstring([MessageLessName], "_", 1)
最后,我们将添加第三个派生列任务,在中,我们将获得最终文件名。
LEFT([MessageLessName], [FirstUnderscore])
现在,由于我的懒惰,这可能会被逐一取消,但因为你可以检查一路上的每一步,你可以验证MessageLessName是否正是你认为应该是的,并且FirstUndercore是我们MessageLessName列中的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));