0

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

message_EDF_100420202.csv
message_UltaBIO_10042020.csv
message_SEIDV_10042020.csv

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

所以我需要一些帮助来正确设置派生列任务中的子字符串函数。

有什么建议吗?

4

2 回答 2

1

使用 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));
于 2020-10-05T13:24:35.813 回答
1

看来您的模式是 message_ Stuff-I-Want _junk (实际模式中不存在空格)。它由下划线分隔,并且由于起始文本是恒定的,这使生活更轻松。

创建一个名为 MessageLessName 的新列

使用表达式删除 message_ 部分

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

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

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

最后,我们将添加第三个派生列任务,在这里我们将获得最终文件名。

LEFT([MessageLessName], [FirstUnderscore])

现在,由于我的懒惰,这可能会有所偏差,但是因为您可以检查沿途的每一步,您可以验证 MessageLessName 是否正是您认为应该的,并且 FirstUnderscore 是我们 MessageLessName 列中的 N 个字符。

于 2020-10-05T03:35:01.373 回答