我正在从 CSV 导入大量(1.26 亿行)文件数据。导入工作正常,除了我试图在导入时导出一列,而不是试图在之后编写脚本(由于行数)。SSIS 对字符串操作函数没有太大帮助,而且我所拥有的可能性也非常复杂。
派生列需要反映文件扩展名。文件扩展名的范围为 1-10 个字符(任何更长的字符都可以被截断为 10),并且(当然)与文件名和路径之间用句点分隔。它们不对应于文件类型的简明列表(例如“docx、xlsx、accdb、msg”是 Office 类型)。文件路径中也可能有句点。在某些情况下,路径末尾不会有文件,只有文件夹名称本身。一些例子:
\\Server\Share\named resource
\\Server\Share\this.looks.like.a.file_but.it.isnt\its_a_directory
\\Server\Share\Group\Year.Month.Day.Subfolder\File.ext
\\Server\Share\Team Folder 1.404\another.file.here.extension
所以我需要能够提取最多 10 个字符的扩展名。我尝试了 TOKEN() 但文件夹名称可能有句点,效果不佳 - 添加\
作为标记分隔符有帮助,但我仍然从文件夹名称中得到奇怪的扩展名。我找不到符合规则的 SUBSTRING()、RIGHT()、FINDSTRING() 和/或 TOKEN() 组合,并且派生列定义不允许像 IF 或 IIF 这样的逻辑。
预计会出现一些误报,我计划在导入后对其进行整理。如果它在这里有帮助,我在 SSIS 提取的 CSV 中有第二列,它是文件的大小(对于填充 0 的文件夹)。由于派生列定义中缺少 IF 或 IIF,因此我也没有考虑到这一点。
首先,您要查找的 IF/IIF 是“?” 条件运算符
? 有条件的
实现派生列的一种方法是像这样解析字符串
在这种情况下,“name”是保存要解析的字符串的列。
我们在这里做的是:
RTRIM( name )
REVERSE()
TOKEN()
TOKENCOUNT()
?
TOKEN()
REVERSE()
这不在表达式语言中(它是 T-SQL),但您应该能够将其用作模式或从 SQL 中提取数据(如果它在哪里)。
如果您将此用作模式,则可以为其创建派生列,
ending
然后将其余部分应用于该列。你真的可以一次性完成,但这样会复杂得多。